From db923970b504f0774dee8c3431bcccdc9f1a8c34 Mon Sep 17 00:00:00 2001 From: Morten Delenk Date: Wed, 29 Jun 2016 19:04:49 +0200 Subject: [PATCH] Added interrupts on the A9 side of the 3DS code for A9 doesn't work at all for the A11 - or I missed the interrupt table location (Which I think should be in AXIWRAM) --- arm9loaderhax.bin | Bin 3328 -> 10892 bytes kernel/hal/3ds/Makefile | 2 +- kernel/hal/3ds/arm11/asm/a11snippets.S | 72 +++++++++++++++++ kernel/hal/3ds/arm11/init/arm11init.cpp | 91 +++++++++++++--------- kernel/hal/3ds/arm11/io/a11textDISP.cpp | 99 ++++++++++++++++++++++++ kernel/hal/3ds/arm9/asm/snippets.S | 68 ++++++++++++++++ kernel/hal/3ds/arm9/boot/boot.S | 4 +- kernel/hal/3ds/arm9/init/init.cpp | 84 +++++++++++++++++--- kernel/hal/3ds/arm9/io/textDISP.cpp | 97 +++++++++++++++++++++++ kernel/hal/3ds/include/textDISP.hpp | 90 +++++++++++++++++++++ kernel/kernel/c_include/stdint.h | 4 +- kernel/libhal.a | Bin 43288 -> 119742 bytes 12 files changed, 559 insertions(+), 52 deletions(-) create mode 100644 kernel/hal/3ds/arm11/asm/a11snippets.S create mode 100644 kernel/hal/3ds/arm11/io/a11textDISP.cpp create mode 100644 kernel/hal/3ds/arm9/asm/snippets.S create mode 100644 kernel/hal/3ds/arm9/io/textDISP.cpp create mode 100644 kernel/hal/3ds/include/textDISP.hpp diff --git a/arm9loaderhax.bin b/arm9loaderhax.bin index f8141caee4c1dc38cee04191acf9baeb167e0c7e..6c92104f0ce9b21b8f7b3d52cc3f387c1deea7b0 100755 GIT binary patch literal 10892 zcmc&)eT-Dsb-(Y;+u66n?ChJ_8FpZ2ciyt3tW&UO*~P{#Hse4NEZlneNQ*G4vAZOT zOkqWE?I0JQJyySKj69-~$$WG&bx(A%ePwhq{aAD|^F(xV z?yl%$$Mexi@1+QuJy}581b)f3mPswQd8}r+XlhK$RjO3Wv^7u8Mf(<70l2MQrJC}_ z>Tf{r0X$u*(dZmgg|4xNb(c~uns=X4{vtJ%U!qhthBY5^YR!_%&iIQ}@9b|@(@T%l zRpCfo`QYUrsJj9?3osA(dcUj_M{TIVJ+c32G_I6ozT6Ywot**C9)J%DbL#2B+G<3V zDnD*k6C9sR9;*{RBXCLJ(|}(A&sV@NQus`HRez}x@k*7yh^PrwC{_MY@V*Z`z%>`V zM}R+K;`^nFTj;FYYD1+}sS_MWz{m5^7xtH3^mb3FG6-IlzrU>fm$j|LvkC{QwV}Gjm zJle+QsouDYcGpyIAKIzhRPR*hRPP|hMKqsYYW0@mo=c z-o6yhG4?!#xbWuGb`AT!Zc_LU�{?x#847^=}_p0Fi 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 Qv!8=1YUEnud7ixg1{e?>bN~PV delta 1031 zcmb_bziSgw9DkR)v}cSom_uU{?6oPSf@xoyMWj@V3I&@|T8p4d!NozLqJx8QF}Et@ zM~5tu8(f8eAUIhZ9K<2u;&^xI8!V{lmZ2Cw-^)9aKfvM3d!Ntu_xF9@tDRE1GIOcH znqqSz`g;#j!M&1zm=F%R4%vk4LaN1rvRi#=L}R6n#;UbhC06~ou%)%~g0)`z@pjQK z!H4m>cmaQA+PFI%ou3vu&xi+XyQ4DpmF^0+ed2rl{?WShS(iS`yuPBGJ3AxkIY}D< zZT*EuPwVFPm2R#Lc^2vB4wU%uoHVEGCR`$H+hdHSDMNfjSLiQ*cf6DMAO>5@|I|?Z zT4-ZB9jg3Fh!KyWa-FdlO0t6XC@%|_#?8+`FQj`2%dy;`H^PsA+4SI*2v>k7@sFREx{jZ=*ZWSe^4@2F5!e&t;glR$_ qg7wabSt4kR??8 -#include -void(**fpointer)(void)=(void(**)(void))0x1FFFFFF8; -void __attribute__((naked)) arm11Stub(void) -{ - //Disable interrupts - __asm(".word 0xF10C01C0"); - - //Wait for the entry to be set - while(*fpointer == &arm11Stub); - - //Jump to it - (*fpointer)(); -} -void mainRoutine() { +#include +extern "C" void initInterrupts(); +void(**fpointer)(void*)=(void(**)(void*))0x1FFFFFF8; +void **farg = (void**)0x1FFFFFFC; +//Flags: +//0: Output from ARM11 +//1: puts() lock +uint32_t *flags = (uint32_t*)0x1FFFFFF4; +namespace MTGosHAL { +void mainRoutine(void*) { + *farg=nullptr; *fpointer=nullptr; while(true) { if(!(*fpointer)) continue; - (*fpointer)(); + (*fpointer)(*farg); + *farg=nullptr; *fpointer=nullptr; + *flags&=~1; } } -unsigned int seed=0; -unsigned int random() { - return seed=0x41C64E6D * seed + 0x00006073; -} -#define CALCXY_top(x,y) ((x)*240+240-(y)) -void initScreen() { +void initScreen(void*) { //top screen lfb size: 0x5dc00 //bottom screen lfb size: 0x4b000 //lfb locations: 0x18000000 (left 1) @@ -38,6 +32,9 @@ void initScreen() { //lfb locations: 0x18120000 (right 2) //lfb locations: 0x18180000 (bottom 1) //lfb locations: 0x181D0000 (bottom 2) + unsigned int *lfbs = (unsigned int*)0x18000000; + for(int i=0;i<475136;i++) + lfbs[i]=0; unsigned int *fb_init=(unsigned int*)0x10400400; fb_init[0x70/4]&=~0x7; fb_init[0x170/4]&=~0x7; @@ -49,18 +46,42 @@ void initScreen() { fb_init[0x168/4]=0x18180000; fb_init[0x16C/4]=0x181D0000; fb_init[0x190/4]=960; - int *lfb=(int*)0x18060000; - for(int bx=0;bx<32;bx++) { - for(int by=0;by<8;by++) { - for(int x=0;x<8;x++) { - for(int y=0;y<8;y++) { - if(font[bx+by*32][y]&(1<pc << "\n"; + out << "R1 " << (int) cpu->r1 << ", R2 " << (int)cpu->r2 << "\n"; + out << "R3 " << (int) cpu->r3 << ", R4 " << (int)cpu->r4 << "\n"; + out << "R5 " << (int) cpu->r5 << ", R6 " << (int)cpu->r6 << "\n"; + out << "R7 " << (int) cpu->r7 << ", R8 " << (int)cpu->r8 << "\n"; + out << "R9 " << (int) cpu->r9 << ", SL " << (int)cpu->r10 << "\n"; + out << "FP " << (int) cpu->r11 << ", IP " << (int)cpu->r12 << "\n"; + out << "SP " << (int) stack << ", PC " << (int)cpu->retAddr << "\n"; + *flags&=~1; + if((id!=1)&&(id!=2)&&(id!=4)) + for(;;); } diff --git a/kernel/hal/3ds/arm11/io/a11textDISP.cpp b/kernel/hal/3ds/arm11/io/a11textDISP.cpp new file mode 100644 index 0000000..f2f1944 --- /dev/null +++ b/kernel/hal/3ds/arm11/io/a11textDISP.cpp @@ -0,0 +1,99 @@ +#include +#include +#include +int x=0, y=0; +extern uint32_t *flags; +namespace MTGosHAL { + FG_color fg=FG_color::WHITE; + BG_color bg=BG_color::BLACK; + uint32_t* toplfb = (uint32_t*)0x18000000; + uint32_t* bottomlfb = (uint32_t*)0x18180000; + int base=10; + + void Screen::putChar(char c) { + while(*flags&2); //to prevent garbage to be displayed when ARM9&ARM11 are trying to access it at the same time + *flags|=2; + switch(c) { + case '\n': + x=0; y++; + break; + case '\r': + x=0; + break; + case '\b': + x--; + if(x<0) x=0; + putChar(' '); + x--; + if(x<0) x=0; + break; + case '\0': + break; + default: + for(int lx=0;lx<8;lx++) { + for(int ly=0;ly<8;ly++) { + if(font[(int)((uint8_t)c)][ly]&(1<=TOP_SCREEN_HEIGHT) + bottomlfb[CALCXY(x*8+lx,(y-TOP_SCREEN_HEIGHT)*8+ly)]=__builtin_bswap32(static_cast(fg)); + else + toplfb[CALCXY(x*8+lx,(y)*8+ly)]=__builtin_bswap32(static_cast(fg)); + } else { + if(y>=TOP_SCREEN_HEIGHT) + bottomlfb[CALCXY(x*8+lx,(y-TOP_SCREEN_HEIGHT)*8+ly)]=__builtin_bswap32(static_cast(bg)); + else + toplfb[CALCXY(x*8+lx,(y)*8+ly)]=__builtin_bswap32(static_cast(bg)); + } + } + } + x++; + if(x==(y>=TOP_SCREEN_HEIGHT?BOTTOM_SCREEN_WIDTH:TOP_SCREEN_WIDTH)) { + x=0; + y++; + } + break; + } + if(y>=TOP_SCREEN_HEIGHT+BOTTOM_SCREEN_HEIGHT) + scroll_impl(); + *flags&=~2; //Unlock + } + void Screen::clrscr_impl() { + for(int p=0;p<400*240;p++) + toplfb[p]=__builtin_bswap32(static_cast(bg)); + for(int p=0;p<320*240;p++) + bottomlfb[p]=__builtin_bswap32(static_cast(bg)); + } + void Screen::scroll_impl() { + for(int ly=0;ly<240-8;ly++) { + for(int lx=0;lx<400;lx++) { + toplfb[CALCXY(lx,ly)]=toplfb[CALCXY(lx,ly+8)]; + } + } + for(int ly=0;ly<8;ly++) { + for(int lx=0;lx<40;lx++) { + toplfb[CALCXY(lx,ly+240-8)]=__builtin_bswap32(static_cast(bg)); + } + for(int lx=40;lx<360;lx++) { + toplfb[CALCXY(lx,ly+240-8)]=bottomlfb[CALCXY(lx-40,ly)]; + } + for(int lx=360;lx<400;lx++) { + toplfb[CALCXY(lx,ly+240-8)]=__builtin_bswap32(static_cast(bg)); + } + } + for(int ly=0;ly<240-8;ly++) { + for(int lx=0;lx<320;lx++) { + bottomlfb[CALCXY(lx,ly)]=bottomlfb[CALCXY(lx,ly+8)]; + } + } + for(int ly=240-8;ly<240;ly++) { + for(int lx=0;lx<320;lx++) { + bottomlfb[CALCXY(lx,ly)]=__builtin_bswap32(static_cast(bg)); + } + } + y--; + } + auto Screen::a11puts(const char *s) -> void { + int i=0; + while(s[i]) + putChar(s[i]); + } +} diff --git a/kernel/hal/3ds/arm9/asm/snippets.S b/kernel/hal/3ds/arm9/asm/snippets.S new file mode 100644 index 0000000..e2a6cb5 --- /dev/null +++ b/kernel/hal/3ds/arm9/asm/snippets.S @@ -0,0 +1,68 @@ +.section .text +.global _a9vectors_begin +.global _a9vectors_end +.extern _start +_a9vectors_begin: + //b start + b data_abort + b fiq + b irq + b prefetch_abort + b _svc + b udi +start: + b =_start +.extern handleINT9 +data_abort: + sub lr, #8 + stmdb sp!, {r0-r12,lr} + mov r0, sp + mov r1, #0 + ldr r2, [pc, #4] + blx r2 + ldmia sp!, {r0-r12, pc}^ +.word handleINT9 +fiq: + sub lr, #4 + stmdb sp!, {r0-r12,lr} + mov r0, sp + mov r1, #1 + ldr r2, [pc, #4] + blx r2 + ldmia sp!, {r0-r12, pc}^ +.word handleINT9 +irq: + sub lr, #4 + stmdb sp!, {r0-r12,lr} + mov r0, sp + mov r1, #2 + ldr r2, [pc, #4] + blx r2 + ldmia sp!, {r0-r12, pc}^ +.word handleINT9 +prefetch_abort: + sub lr, #4 + stmdb sp!, {r0-r12,lr} + mov r0, sp + mov r1, #3 + ldr r2, [pc, #4] + blx r2 + ldmia sp!, {r0-r12, pc}^ +.word handleINT9 +_svc: + stmdb sp!, {r0-r12,lr} + mov r0, sp + mov r1, #4 + ldr r2, [pc, #4] + blx r2 + ldmia sp!, {r0-r12, pc}^ +.word handleINT9 +udi: + stmdb sp!, {r0-r12,lr} + mov r0, sp + mov r1, #5 + ldr r2, [pc, #4] + blx r2 + ldmia sp!, {r0-r12, pc}^ +.word handleINT9 +_a9vectors_end: diff --git a/kernel/hal/3ds/arm9/boot/boot.S b/kernel/hal/3ds/arm9/boot/boot.S index 7912419..64419ac 100644 --- a/kernel/hal/3ds/arm9/boot/boot.S +++ b/kernel/hal/3ds/arm9/boot/boot.S @@ -44,8 +44,8 @@ _start: mrc p15, 0, r0, c1, c0, 0 // read control register orr r0, r0, #(1<<18) // - itcm enable orr r0, r0, #(1<<16) // - dtcm enable - orr r0, r0, #(1<<12) // - instruction cache enable - orr r0, r0, #(1<<2) // - data cache enable + //orr r0, r0, #(1<<12) // - instruction cache enable + //orr r0, r0, #(1<<2) // - data cache enable orr r0, r0, #(1<<0) // - mpu enable mcr p15, 0, r0, c1, c0, 0 // write control register diff --git a/kernel/hal/3ds/arm9/init/init.cpp b/kernel/hal/3ds/arm9/init/init.cpp index 95df592..58b6a77 100644 --- a/kernel/hal/3ds/arm9/init/init.cpp +++ b/kernel/hal/3ds/arm9/init/init.cpp @@ -1,14 +1,74 @@ -void __attribute__((naked)) arm11Stub(void); -void mainRoutine(); -void initScreen(); -void(**a11fpointer)(void)=(void(**)(void))0x1FFFFFF8; -extern "C" void init() { - *a11fpointer=&arm11Stub; - for(int i=0;i<100;i++); - *a11fpointer=&mainRoutine; - while(*a11fpointer); - *a11fpointer=&initScreen; - while(*a11fpointer); +#include - while(true); +void(**a11fpointer)(void*)=(void(**)(void*))0x1FFFFFF8; +void **a11farg = (void**)0x1FFFFFFC; +extern uint32_t *flags; +extern unsigned int _a9vectors_begin; +extern unsigned int _a9vectors_end; +extern unsigned int _a11vectors_begin; +extern unsigned int _a11vectors_end; +namespace MTGosHAL { + void mainRoutine(void*); + void initScreen(void*); + void testSVC(void*); + void main() { + *a11farg = 0; + *a11fpointer=&mainRoutine; + while(*a11fpointer); + *a11fpointer=&initScreen; + while(*a11fpointer); + unsigned int * output=(unsigned int*)0x08000000; + Screen out; + out << "Waiting for interrupt...\n"; + out << "Copying " << &_a9vectors_end-&_a9vectors_begin << " words...\n"; + for(int i=0;i<(&_a9vectors_end-&_a9vectors_begin);i++) { + output[i]=(&_a9vectors_begin)[i]; + } + asm volatile("svc #0\n"); + out << "Did it work?\nSetting up A11 interrupts\n"; + output=(unsigned int*)0x1FF80000; + out << "Copying " << &_a11vectors_end-&_a11vectors_begin << " words...\n"; + for(int i=0;i<(&_a11vectors_end-&_a11vectors_begin);i++) { + output[i]=(&_a11vectors_begin)[i]; + } + out << "Done!\n"; + *a11fpointer=&testSVC; + while(*a11fpointer); + out << "Did it work?\n"; + for(;;); + } +} +extern "C" void init() { + MTGosHAL::main(); +} +struct cpu_info { + unsigned int pc; + unsigned int r12; + unsigned int r11; + unsigned int r10; + unsigned int r9; + unsigned int r8; + unsigned int r7; + unsigned int r6; + unsigned int r5; + unsigned int r4; + unsigned int r3; + unsigned int r2; + unsigned int r1; + unsigned int retAddr; +}; +extern "C" void handleINT9(uint32_t stack, uint32_t id) { + MTGosHAL::Screen out; + out << MTGosHAL::Base::HEXADECIMAL << MTGosHAL::FG_color::RED << "Interrupt! " << (int)stack << "-" << (int)id << "\n"; + struct cpu_info *cpu=(struct cpu_info*)stack; + out << "handler addr " << (int) cpu->pc << "\n"; + out << "R1 " << (int) cpu->r1 << ", R2 " << (int)cpu->r2 << "\n"; + out << "R3 " << (int) cpu->r3 << ", R4 " << (int)cpu->r4 << "\n"; + out << "R5 " << (int) cpu->r5 << ", R6 " << (int)cpu->r6 << "\n"; + out << "R7 " << (int) cpu->r7 << ", R8 " << (int)cpu->r8 << "\n"; + out << "R9 " << (int) cpu->r9 << ", SL " << (int)cpu->r10 << "\n"; + out << "FP " << (int) cpu->r11 << ", IP " << (int)cpu->r12 << "\n"; + out << "SP " << (int) stack << ", PC " << (int)cpu->retAddr << "\n"; + if((id!=1)&&(id!=2)&&(id!=4)) + for(;;); } diff --git a/kernel/hal/3ds/arm9/io/textDISP.cpp b/kernel/hal/3ds/arm9/io/textDISP.cpp new file mode 100644 index 0000000..3c92aca --- /dev/null +++ b/kernel/hal/3ds/arm9/io/textDISP.cpp @@ -0,0 +1,97 @@ +#include +#include +//Flags: +//0: Output from ARM11 +//1: puts() lock +extern uint32_t *flags; +namespace MTGosHAL { + auto Screen::puts(const char *s) -> void { + + void(**a11fpointer)(void*)=(void(**)(void*))0x1FFFFFF8; + void **a11farg = (void**)0x1FFFFFFC; + int i=0; + while(s[i]) { + if(*flags&1) + putChar(s[i++]); + else { + while(*a11fpointer); + *a11farg=(void*)((unsigned int)s[i++]); + *a11fpointer=(void(*)(void*))&putChar; + } + } + } + auto Screen::clrscr() -> void { + void(**a11fpointer)(void*)=(void(**)(void*))0x1FFFFFF8; + while(*a11fpointer); + *a11fpointer=(void(*)(void*))(clrscr_impl); + } + auto Screen::scroll() -> void { + void(**a11fpointer)(void*)=(void(**)(void*))0x1FFFFFF8; + while(*a11fpointer); + *a11fpointer=(void(*)(void*))(scroll_impl); + } + template <> + auto Screen::operator<<(FG_color fg) -> Screen &{ + fg=fg; + return *this; + } + template <> + auto Screen::operator<<(BG_color bg) -> Screen &{ + bg=bg; + return *this; + } + auto Screen::setColor(FG_color fg) -> Screen &{ + fg=fg; + return *this; + } + auto Screen::setColor(BG_color bg) -> Screen &{ + bg=bg; + return *this; + } + auto Screen::setColor(FG_color fg, BG_color bg) -> Screen &{ + return (*this).setColor(fg).setColor(bg); + } + template <> + auto Screen::operator<<(Base output) -> Screen & { + base=static_cast(output); + return *this; + } + template <> + auto Screen::operator<<(int op) -> Screen & { + uintptr_t output=op; + const char* chars="0123456789ABCDEF"; + char buf[33]; + buf[32]='\0'; + char* ptr=buf+31; + do { + *(ptr--)=chars[output%base]; + output/=base; + } while(output && (ptr!=buf)); + puts(ptr+1); + return *this; + } + template <> + auto Screen::operator<<(long int op) -> Screen & { + uint64_t output=op; + const char* chars="0123456789ABCDEF"; + char buf[65]; + buf[64]='\0'; + char* ptr=buf+63; + do { + *(ptr--)=chars[output%base]; + output/=base; + } while(output && (ptr!=buf)); + puts(ptr+1); + return *this; + } + template <> + auto Screen::operator<<(char output) -> Screen & { + putChar(output); + return *this; + } + template <> + auto Screen::operator<<(char* output) -> Screen & { + puts(output); + return *this; + } +} diff --git a/kernel/hal/3ds/include/textDISP.hpp b/kernel/hal/3ds/include/textDISP.hpp new file mode 100644 index 0000000..fe69f73 --- /dev/null +++ b/kernel/hal/3ds/include/textDISP.hpp @@ -0,0 +1,90 @@ +#ifndef _TEXTDISP_H +#define _TEXTDISP_H +#include +#include +#include + +#define TOP_SCREEN_WIDTH 50 +#define TOP_SCREEN_HEIGHT 30 +#define BOTTOM_SCREEN_WIDTH 40 +#define BOTTOM_SCREEN_HEIGHT 30 +namespace MTGosHAL { + enum class BG_color : uint32_t { + BLACK=0x000000, + BLUE=0x0000AA, + GREEN=0x00AA00, + CYAN=0x00AAAA, + RED=0xAA0000, + MAGENTA=0xAA00AA, + BROWN=0xAA5500, + LIGHT_GREY=0xAAAAAA, + GREY=0x555555, + LIGHT_BLUE=0x5555FF, + LIGHT_GREEN=0x55FF55, + LIGHT_CYAN=0x55FFFF, + LIGHT_RED=0xFF5555, + LIGHT_MAGENTA=0xFF55FF, + YELLOW=0xFFFF55, + WHITE=0xFFFFFF + }; + enum class FG_color : uint32_t { + BLACK=0x000000, + BLUE=0x0000AA, + GREEN=0x00AA00, + CYAN=0x00AAAA, + RED=0xAA0000, + MAGENTA=0xAA00AA, + BROWN=0xAA5500, + LIGHT_GREY=0xAAAAAA, + GREY=0x555555, + LIGHT_BLUE=0x5555FF, + LIGHT_GREEN=0x55FF55, + LIGHT_CYAN=0x55FFFF, + LIGHT_RED=0xFF5555, + LIGHT_MAGENTA=0xFF55FF, + YELLOW=0xFFFF55, + WHITE=0xFFFFFF + }; + extern FG_color fg; + extern BG_color bg; + extern uint32_t* toplfb; + extern uint32_t* bottomlfb; + extern int base; + class Screen { + private: + static auto putChar(char c) -> void; //ARM11 + static auto clrscr_impl() -> void; //ARM11 + static auto scroll_impl() -> void; + public: + auto puts(const char *s) -> void; + auto a11puts(const char *s) -> void; + Screen(){ + } + template + auto operator<< (T output) -> Screen & { + puts(output); + return *this; + } + auto clrscr() -> void; + auto scroll() -> void; + auto setColor(FG_color fg) -> Screen &; + auto setColor(BG_color bg) -> Screen &; + auto setColor(FG_color fg, BG_color bg) -> Screen &; +}; +template <> +auto Screen::operator<<(FG_color fg) -> Screen &; +template <> +auto Screen::operator<<(BG_color bg) -> Screen &; +template <> +auto Screen::operator<<(Base output) -> Screen &; +template <> +auto Screen::operator<<(int output) -> Screen &; +template <> +auto Screen::operator<<(long int output) -> Screen &; +template <> +auto Screen::operator<<(char output) -> Screen &; +template <> +auto Screen::operator<<(char* output) -> Screen &; +} +#endif +#define CALCXY(x,y) ((x)*240+239-(y)) diff --git a/kernel/kernel/c_include/stdint.h b/kernel/kernel/c_include/stdint.h index c233efc..ae3ca98 100644 --- a/kernel/kernel/c_include/stdint.h +++ b/kernel/kernel/c_include/stdint.h @@ -8,7 +8,7 @@ typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long int uint64_t; typedef unsigned int uintptr_t; - +typedef unsigned int size_t; #else typedef signed char int8_t; typedef signed short int16_t; @@ -19,5 +19,5 @@ typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long int uint64_t; typedef unsigned long int uintptr_t; -#endif typedef unsigned long int size_t; +#endif diff --git a/kernel/libhal.a b/kernel/libhal.a index 0f1fd067165b9ba3e7eeef706419d15f6689988d..1b1ce743258b232782d067665ad01184ba850382 100644 GIT binary patch literal 119742 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%0D(lYxbThcpHo3@Vh%LZ?} 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