From aba82eaacb7b59ba297a108d3b46f8098a3c6611 Mon Sep 17 00:00:00 2001 From: Curle Date: Thu, 27 Aug 2020 01:39:56 +0100 Subject: [PATCH] Add support for C++ This was a doozy. I had to recompile gcc with a custom target to get it to output the CRT{BEGIN/END}.o files with proper 64 bit relocations. The CMakeLists.txt file was also edited to allow these files to be linked (thereby actually adding the support) as well as to automatically create the boot image upon build. --- CMakeLists.txt | 46 ++++++++++++++++++++++++++----------- chroma/inc/kernel/chroma.h | 4 ++++ chroma/kernel.c | 14 ++++++++++- global/a.out | Bin 0 -> 720 bytes global/crt0.c | 11 +++++++++ global/crt0.o | Bin 0 -> 1360 bytes global/crt0.s | 10 ++++++++ global/crtbegin.o | Bin 0 -> 3584 bytes global/crtend.o | Bin 0 -> 1800 bytes global/crti.o | Bin 0 -> 912 bytes global/crti.s | 13 +++++++++++ global/crtn.o | Bin 0 -> 856 bytes global/crtn.s | 9 ++++++++ linker.ld | 8 ++++++- 14 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 global/a.out create mode 100644 global/crt0.c create mode 100644 global/crt0.o create mode 100644 global/crt0.s create mode 100644 global/crtbegin.o create mode 100644 global/crtend.o create mode 100644 global/crti.o create mode 100644 global/crti.s create mode 100644 global/crtn.o create mode 100644 global/crtn.s diff --git a/CMakeLists.txt b/CMakeLists.txt index 6686564..7fad308 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,26 +9,46 @@ project(chroma) SET(src_files - chroma/kernel.c - chroma/video/draw.c - chroma/video/print.c - chroma/system/cpu.c - chroma/system/rw.c - chroma/system/serial.c - chroma/system/memory/paging.c - chroma/system/memory/physmem.c - chroma/system/drivers/keyboard.c + ${CMAKE_SOURCE_DIR}/chroma/kernel.c + ${CMAKE_SOURCE_DIR}/chroma/video/draw.c + ${CMAKE_SOURCE_DIR}/chroma/video/print.c + ${CMAKE_SOURCE_DIR}/chroma/system/cpu.c + ${CMAKE_SOURCE_DIR}/chroma/system/rw.c + ${CMAKE_SOURCE_DIR}/chroma/system/serial.c + ${CMAKE_SOURCE_DIR}/chroma/system/pci.c + ${CMAKE_SOURCE_DIR}/chroma/system/memory/paging.c + ${CMAKE_SOURCE_DIR}/chroma/system/memory/physmem.c + ${CMAKE_SOURCE_DIR}/chroma/system/drivers/keyboard.c ) include_directories("chroma/inc") SET(src_no_sse - chroma/system/interrupts.c + ${CMAKE_SOURCE_DIR}/chroma/system/interrupts.c +) + +SET(src_preamble + ${CMAKE_SOURCE_DIR}/global/crt0.o + ${CMAKE_SOURCE_DIR}/global/crti.o + ${CMAKE_SOURCE_DIR}/global/crtbegin.o +) + +set(src_epilogue + ${CMAKE_SOURCE_DIR}/global/crtend.o + ${CMAKE_SOURCE_DIR}/global/crtn.o ) set_property(SOURCE ${src_no_sse} PROPERTY COMPILE_FLAGS -mgeneral-regs-only) -add_executable(kernel.elf ${src_files} ${src_no_sse} font.o) -target_compile_options(kernel.elf PRIVATE -ffreestanding -O2 -Wall -Wextra -Wall -Werror -pedantic -fPIC) -target_link_options(kernel.elf PRIVATE -T linker.ld -ffreestanding -O2 -nostdlib -lgcc) +add_executable(kernel) +target_sources(kernel PUBLIC ${src_preamble} PUBLIC ${src_files} PUBLIC ${src_no_sse} PUBLIC ${CMAKE_SOURCE_DIR}/font.o PUBLIC ${src_epilogue}) +target_compile_options(kernel PRIVATE -ffreestanding -O2 -Wall -Wextra -Wall -Werror -pedantic -fPIC -fno-exceptions) +target_link_options(kernel PRIVATE -T linker.ld -ffreestanding -O2 -nostdlib -nostartfiles -lgcc) + +add_custom_command( + TARGET kernel + POST_BUILD + COMMAND cp ${CMAKE_SOURCE_DIR}/kernel ${CMAKE_SOURCE_DIR}/img/boot/exe + COMMAND ${CMAKE_SOURCE_DIR}/mkbootimg chroma.json chroma.img +) \ No newline at end of file diff --git a/chroma/inc/kernel/chroma.h b/chroma/inc/kernel/chroma.h index b9e1eb7..e22fa31 100644 --- a/chroma/inc/kernel/chroma.h +++ b/chroma/inc/kernel/chroma.h @@ -58,3 +58,7 @@ void InitPrint(); void SetupInitialGDT(); void SetupIDT(); + +int Main(); + +void Exit(); diff --git a/chroma/kernel.c b/chroma/kernel.c index 9205766..b82b5c2 100644 --- a/chroma/kernel.c +++ b/chroma/kernel.c @@ -16,12 +16,16 @@ size_t KernelAddr = (size_t) &LoadAddr; size_t KernelEnd = (size_t) &end; -void _start(void) { +int Main(void) { SerialPrintf("\r\nBooting Chroma..\r\n"); SerialPrintf("Kernel loaded at 0x%p, ends at 0x%p, is %d bytes long.\r\n", KernelAddr, KernelEnd, KernelEnd - KernelAddr); + SerialPrintf("The bootloader has put the paging tables at 0x%p.\r\n", ReadControlRegister(3)); + + TraversePageTables(); + ListMemoryMap(); InitPrint(); @@ -41,5 +45,13 @@ void _start(void) { for(;;) { } + + return 0; } + + +void Exit(int ExitCode) { + SerialPrintf("Kernel stopped with code %x\r\n", ExitCode); + +} \ No newline at end of file diff --git a/global/a.out b/global/a.out new file mode 100644 index 0000000000000000000000000000000000000000..ee9c26914d985091e07c2fc7c7435255276cfac9 GIT binary patch literal 720 zcmbV}u?oU46h*JC6&-{M4vLFT;^OQiE;>2*1Ep3}bkM zck*uTO%rmP&Sze!1Q{O2(A^aiBiRZp-WFOJk!OMm0^<#gQ;H-kGnR!w*C^35dh*g& z__X_(&rvk_@bdGCu8$Xzo?$7HVf~BVWc}{=5yz`EjZ>AJ6ynV~Q3>I=28QY7ppq3) zoh)}U+aLD|!!69v!{wLgQh9 mGSR26%6*GjW1ZU^As@7zD|W(it~O|<_jSjBjeTdq&A$M1g(cAd literal 0 HcmV?d00001 diff --git a/global/crt0.c b/global/crt0.c new file mode 100644 index 0000000..5f3ba44 --- /dev/null +++ b/global/crt0.c @@ -0,0 +1,11 @@ + +extern void Exit(int code); +extern int Main(); + +extern void _init(); + +void _start() { + _init(); + int ex = Main(); + Exit(ex); +} \ No newline at end of file diff --git a/global/crt0.o b/global/crt0.o new file mode 100644 index 0000000000000000000000000000000000000000..af9b40e1fa048808a004c3fbddf009ab9d5896bb GIT binary patch literal 1360 zcmbu9Jxc>Y5QgUxKjT*v1yR8?ih>+kDHeJXVj`%8U>(kQY9NVl*&^B~2tu&Q&#@FN z#D8HUSlHMHbl%*KS%Vn>^tkvzE z%)&lcg%l-wdvlDfG3wlC1 zC&b~7Bwjf32(Qg3_*cProhaUHFWOuni3bm#9r_=1+$+$DKjsS zxUiA5i&(M{QQU|wTnKLJ&W+F*=~mnYMd&8bP>{M1i zzH{%pXJ#(vCPup~ONm(O6}4vxs#NAsY#vTCs#`s-+_kf?+_eWnHFz(0!o3#Fuigj_ zwQi+)m$9+IU1l%ROi&ji|mGPv*wNvI~9b?t-I*TDC~YMroj0{&|U{7=Gszh3xs99?Ff4 zPlgWp^TXm@^c()gax?H7I;iSGrC#%!l%iPI7c2ESucC`Vz0uU(!lEkFtCuQ%;1`{f z3aBm@7o7oBYIs#&7ZZkt1|G ze_rpglRLQc-dx3x)}*fX6EHZq^>7UDiQ!K&{sL+AxcI-sxS8in43Fn|opI!Onug?Q#QgE?bf4>a zpK;tc{2&PaA>-gZMnm$Tk08haf5ATkNCJO+3km)uKoa23(h&R`fF!_?3j^|Fr1s%I zcfjv3j{19PNd14r{IMpye=!a|_zP}RUqGZD$@4tp$dRTYxMTR^j3B3Cc%1hv}hhnZ8U7rY9C)G1}2(u}fGM_2t?5LNpBo@w5z`3sog zv@^1Aw$1Ne+~7}CBG}^CCG6az@?9YK|VHkBXsY*i2Wi>kkgF+ zg5zHkN7iY>9w0l3U*e@+2{Y}}9pb-Ye$(Hy&v85-lhCN^9riE%D~{tG_&dd${BQqD zyyP2k7BACvzI^Y@dE%lFLR9S3PH`;Tk$?jU579eTJiju3`3H~H~S%-$hL b-Q|lmDMSEC3{xR*Qv7u$S_`B09%lSMc)Q)_ literal 0 HcmV?d00001 diff --git a/global/crtend.o b/global/crtend.o new file mode 100644 index 0000000000000000000000000000000000000000..1e31c40b1e83855e3496b309945a427da44d16ca GIT binary patch literal 1800 zcmbtU&ubGw6n>jk8&MmJ2#QE^@(0M!>ZKIalr-%swnA+M4?1j;jV z*hicNaP0lKmV`B^z$7^R!-Slj!BAb>a9(}6=e$0jX1p>=UbU5y&q2h z;o#$5M^vU?B(v-#4+9cSzo`qCL61ZQX*JdTUcpis2$43e%N$<*-~K?OSiX; zoW)VW`bu5XX^*Lu&{3Cv4O2TkCeL@3`1JhNd=T-IK)FryDoXt(N0H~dLV4Q?MB7y^ zh-MsvNS22gS|tc?Q+6UZ@Ia_Qw*0W`Nu0$;oT#_DTc~b@LEv?jUfO@TDynHO<_Xj= zN4Aibl5-PT$PvvHT2g2w-t^qxX?lg^~C;R1T9&;8eFc+P?0i92dn5YR38 zSN$w%i|W7BMa&y$;<+*U-M`e|)Oy`6tpa$XBlAmO;#*p8?*DBzQ$8@)|48f2^Jl&J z#WDN;0QE)Z|3Pnv&za7jz6xBQ^KH!0oP19(OzfTZr?h9s^+&zgJL10Af@hj|0`Vk1 hW_?{tsCYiq8N5 literal 0 HcmV?d00001 diff --git a/global/crti.o b/global/crti.o new file mode 100644 index 0000000000000000000000000000000000000000..440788727c348a40385be2b6dc3817db35190019 GIT binary patch literal 912 zcmbVKEw2JG5S-)qI0S;1kdUBI7*c^kkrR&>1OkI5M}U9;!Bv1l^RM_b{ExTWYXjMq z5ZFt*?R2I$ZTB*s{*|H#E+UNZm^l=fJ%Oo#Q`C`QKDpkxJ(&I|4(XUGZ?X`xD^T4DR!>*d2Bniwz|}<>$T5mX!6e$Xhqk>yw6BWjcde<~fwnsY2)3 z_!#Jrg1uLTG8J<-eR>uHb*X1e-e780{Z8t8L`kT9tM8MR_k87FzM%a7;D!E|aE^C+ x-Y-;D6Qc%hHgg@YM?Nb@yGT^i{@Hmcu|^w~=aTf_qy>3*%xziX&JfjWMqH=Mg}_u1P><4z#xGn=l~XWVBlonV2C{&dl;b#JBt~si3|+P3`|%x zFau?<0cHjkY{Ed*tXRbLiYs$V5|bG8ic5+hbOwx7l3G#1pqG+ZlE|Q!R9wuUmzkFd z6i5S7SPUXdNE)aM6l82@x*gE?FfLN?f`t@;BuETBBpkr9m;}0hb)XUsASPG84p1-1 zOkD0qk2!Svjd1990*ZqGA^jlp(A9wSd4LEYm;j*|*nu?2jUc~*fCPjBrcF%0gQRXi W<