From e5679210b0d63a35f370ae6976aeae988165a28c Mon Sep 17 00:00:00 2001 From: ThatLinuxFan <9904667+NodeMixaholic@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:19:23 -0600 Subject: [PATCH] holy crap i got it to boot! :smile: --- gems-kernel.git/build.sh | 4 +- gems-kernel.git/builds/blocks/bootloader.o | Bin 0 -> 880 bytes gems-kernel.git/builds/gems.iso | Bin 9527296 -> 9527296 bytes gems-kernel.git/builds/iso/gems.elf | Bin 19328 -> 19396 bytes gems-kernel.git/linker.ld | 52 ++++++++++ gems-kernel.git/quick-test.sh | 5 + gems-kernel.git/source/bootloader.asm | 106 +++++++++++++++++---- gems-kernel.git/source/debug.h | 2 +- gems-kernel.git/source/linker.ld | 89 +++++++++-------- gems-kernel.git/source/os.c | 8 +- gems-kernel.git/source/start.s | 93 +++++++++--------- gems-kernel.git/source/time.h | 19 +++- gems-kernel.git/test-mute.sh | 0 13 files changed, 263 insertions(+), 115 deletions(-) create mode 100644 gems-kernel.git/builds/blocks/bootloader.o create mode 100644 gems-kernel.git/linker.ld create mode 100755 gems-kernel.git/quick-test.sh mode change 100644 => 100755 gems-kernel.git/test-mute.sh diff --git a/gems-kernel.git/build.sh b/gems-kernel.git/build.sh index 0f064bf99..f384fdf3a 100755 --- a/gems-kernel.git/build.sh +++ b/gems-kernel.git/build.sh @@ -7,12 +7,12 @@ mkdir builds/iso mkdir builds/iso/boot mkdir builds/iso/boot/grub echo "Building bootloader" -nasm -f elf32 source/bootloader.asm -o builds/blocks/bl.o +nasm -f elf32 source/bootloader.asm -o builds/blocks/bootloader.o echo "Building basic keyboard support" nasm -f elf32 source/detect-kbinput.asm -o builds/blocks/detectkeys.o echo "Building OS" set disassembly-flavor intel -opt/cross/bin/i686-elf-gcc builds/blocks/bl.o -ffreestanding -nostdlib builds/blocks/detectkeys.o source/os.c -w -g -m32 -o builds/iso/gems.elf -I"/usr/include" -I"source/THIRDPARTY/lwext4-master/include/" -I"source/THIRDPARTY/linux-old/include/linux" -I"source/THIRDPARTY/linux-old/include/asm" +opt/cross/bin/i686-elf-gcc builds/blocks/bootloader.o -ffreestanding -nostdlib builds/blocks/detectkeys.o source/os.c -w -g -m32 -o builds/iso/gems.elf -I"/usr/include" -I"source/THIRDPARTY/lwext4-master/include/" -I"source/THIRDPARTY/linux-old/include/linux" -I"source/THIRDPARTY/linux-old/include/asm" echo "Creating GRUB config" echo "set default=0" > builds/iso/boot/grub/grub.cfg echo "set timeout=60" >> builds/iso/boot/grub/grub.cfg diff --git a/gems-kernel.git/builds/blocks/bootloader.o b/gems-kernel.git/builds/blocks/bootloader.o new file mode 100644 index 0000000000000000000000000000000000000000..0df3ae8023df43abc21846996f46b1a46aab285d GIT binary patch literal 880 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 Ne^i0D;kPXO{{kqT@9_Wt delta 23096 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 bt4pXbAN$Yee>(7=4*Xy0z_EzfH1_`iivT@O diff --git a/gems-kernel.git/builds/iso/gems.elf b/gems-kernel.git/builds/iso/gems.elf index 9714a34481b3500e240d19c54caa02b97f13ce4f..9f288c868d53f2ce69cd7ea6795436fb24b261db 100755 GIT binary patch delta 9612 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 delta 9265 zcmZ`<3wTu3wch77nS=?G48gpglY~Hkg!e-dATnG91eAtK1?9~U2t-Jvw!k1ES7Ovl zJl02zk4XDnFRc%ZTB;O7YvrQVVr@k#;G+gk42TNWXd}7*zt5bR>Akn(mvh#?{T*gu**@`*k<}vLJ5laHqSd2Os-u-E(7T z4s4n_8@%l_ZtPU{^4{~s5rYJc_bmBcb#s?}Z9G@r5^%pnb#vfYbM>D;s6BRSiFGPq zoidg_sJl-eJ+bYK_g8^4&wExk2R=Db`^g8}-aAoyrX}!ROZCa-KyQ!USlg#GZtE2d zf8TQyfz4@3Qf=coy}zN)+SA|P-}tIq>brU}psi7?w`^s5VK_bBy)PPhxb5m}c;7ab ztjrVX?WKvG?`zU7+yxsb=G)5NWErIM@Q3ck|ITYZ-0t3QHmNg06QO3`+NVI^Sn%F6 z_oexc&il-n>s^ZA2DdffwR|Idr%S$3AQzf zBL;O*6YDQ*LU!3IfM{h$aN{|5O}e$up0mbto}hZ4?zW2l!EPo2*9^1n{x0O8pqs2a z%3f*JNmrT%y(D|Sb&PA~SPPg#hF z367xamMH19KCnr9deA@Xg?a9foT6cl7fMsbihN8*so<4Gz8Mhz|z zUzU?7`TU;%e-_0Ph)+lHeB!sF_!iODRPnIQz{=pm&U^dS1if+Fv34lZ%GSYv ziuNR2?w)ThN~la;o|qrDR~ja?B+l4xel#GfsL@h(2QHulT`&gQt#+^H<8DV*|9{KW zuw`k~Qfn9+j#-$I9;VMn(&^P>=*%$vOq4bnMmgT8**4u%AI`xQ!{vs#NntLoq0I49 z^3Caj2R6a9P6CWP_hx$BJAr$@dErGtf_Xvpt=XR@r#*T3(b6*nz z;t{=R$A0s4;?QKi?UuTE=n#U zxidlrgT$L`+`Rzhj(ObAL#wf#YlAV0C0B{mlL0e;2O6zJ?cD<vx-&{%X?^-tBnd7sYgLq-W4#$A7tr(SD7nOX)+X@|@dT^MmPXkPmKk;ZKFNVm zGGyHvB^QzW;>&On?iwX{5CdkpoLQr0JKsc?oL;zV)Zl4qK9(9;!)k=J`}3F>FOvUV z)I$mGqGo@rM!w%3b2J`=2t-3@!JjgX9kFzAln!UP474-ZK~O}9C@{?Cyd6*Z3MNPE8sPq-(TjJ>>- z9OdOZS&8B-@?SV(>!~rUL+7QlH4$lAC&RDDt7*2{9`A5>)68EC8ZqE~7+@q(M@7d6 zgRavj&kkHaH!x?!oWR1soV=^9pT6K~azZ@t@xFbh#*Uu8`aqkw=h*6lm%XbGbjIED zo;4Tm|4TjJ^;|ZU+KsMiD%61xW%6_AI0rLmw5=cue*RU ziVq_2sjmM11#DsZKzEZ`m1wB*e(%wB!Q;|N{3XFLE2Fp%;-EAA{UdOXn68zU(liTi z&OEf3o}(t9McjJP25wzw5w|~enU~WuTnAxxw#&@P$Z(y6_(_*p39%32-@443AZFp| zEk^)|Qy{*J)*&v2sGcD?19)fZ!#5XMSG{iQD#oZVtWD9X*w|O};M;ULP z%E)x}K~d3d=42tFE<{zg`6weoTnG``#Sj<48RAxmGrG;w5ZfS*MI4OdL5N>=_xJb2 zj-z^34rC#8C&B;bQ?oL=z@_6PyXCxj8pBoy@s{&!cjgR;w_=SAjSa9WIuR?uhrp-C z@(ZH;F6qz7DE=A57MNDYnyS}HTTcJ0;5*NA&_bU;d>5wI{gdgn5mOzf>Nu?Uix{BD z^3X15G+?Mg@PEZ)#dBPQueP&FgK7r&cfiZl?yN-U$t`t>F`^&jX8;jrhzz_Hj&I{F zG&z>Lm4VI6xl>0zv_p6QU=TU`cdb_lj4*z>at^D`GYJXLgdh#gb$KP%yoOa{=*HR& z^+KBkLzf=JRa+>1TzT-;mPy&23RzcN>A0z{;NmH+C7~KV+|&=ulX=sYCt=_`5AB5_ zPIu{abn}gnn5%L#>C)fFHGVNP0}G|Nmf~o(8;^6A7&t+STtEY_q^KT-=uP`EL@gHv z>PP1G{0wEE`A~jYQ3e`In#edF&jJig(j>}Bo`=z;q{)<1JPqdgeE%o~%_L2urqJ^@ zdQGQX;whnAMR~ZVpEfgIhi|!Of;qh)RjD)=75J68<~GRL=1&Uz)x+4zVm@d$c=%-{ zX~{9ji#?r;bJGdLS?XCv`Q{?XD?NV3T*{6FJv*siu0pe3sC*43$IU{I5+5@Y{S%cT z=1hNSXeiXaJF{_(Z-Ke5MT!T|#-I#F@h-+?9({#2gI3%e49cX&_c|`BoI*V4I5zl} z!d5N09cn}4XA@mflQEjUZ*WnEGMu6DlgXeT3QdtPq?HigCN$Ni`9)yR`V~S8$K}c0 zHyN2}x^19SF&g=421n7*#!@i~{nGs3%9h&Nv65qQ>RvTtF#;-EIOSCBES}-(zG4Sn#g<@h6$<_(O+onWLf7?= z;p3}A+AeK1t+gFEO!?}db%p!EbCz!%&iTS+*p2ag=4+&h%U1A2<+}wIDdm5XK~kV_ z>CD7;0E(1RwmJ>!lnyu!K0Zul>Bnxsy9|zr$Y8Kc>i!4eR0Wk={Z_`}p~lxcof^&7 z@L=O*%T8aB!#7wirRU?3A`YLYLM7J9j##NNru2R&J&YDV*{7-MV|cG|}Q5 zljN{T_FCcg*=^Q~tmOs6ENJi-i1dsEs2E|cP+HNEjKo8>NqEK7c zi`-AZ#3jr#4-ZL6DuyNBc1qh5w7kvi8d99BKv^V}?@@WDZf2EahN?N7W0}a=yL5Mk z;pa2w zdN>=?GMe$pRrcU8xHK=aHe|&{J|g{7+KimC8=sn`P5K1fLdMYH(D36n){7T;8AbU} z43LV#i|DB_`0^dP+bd4&@N3d{HVfntFjf9OzjJR*#;! z5H=;!rl_BM%E*YKhY8fz)(L&Ed;_*_5yh{fue#dt@4EZP(y257t?f0J4l5sdJCviP zaxRqFb@iKs_6}>aGG7cCht6qlTniJsbKA{B!-giM0^3WylW`84Uk@t@-AmJhY;gc+ zkBm5^2)StoE;i|I?o^bvZ)pDwrb;_t=TU^22LssU?8HsG$K0j67b2q4 zb|2;_?QKT8hq>|Dm0|9oA1X(7sCHGY(DvA5z5g9}@-sG;lD5yb2^O4!vI6#75sbtG zHc==16VNglY9F_?>j85k?3%gpTI?vY1nzG)de zUvJdiPvEY!1wr z;LvP9Zp)Om>_h~)4sa!4_KJ<`g*M90xZeK*sIR4Z)5a}A8)K{M{41d5LP+_P9iLDR zk>v@$A#t45?BOuT1ytJRA$r<6CYODcG^;;~ zZY#4l-72&c+i8m^T*1W@_t)Eu340g{CDc~h zK+V)nN7I(I4UeWenI6wUIZ)v3k)=%6}1M*{IGx8>Seh zusX+9*9%daO!L%!?B_A6h*U^3)i@4?T_?^WG=@TTJq_N_<~wysjT^}>7}^|`v(g*T zoRa)@B+ig?3>W_b6g*ETZN=tYW!Z6WqMM5HP{*@neX4SI$5W#}1~T`I&GlDSu2Cxo zm0eR)x#s2LS5=f9eeKz)6^lkyG)}E(sH|wvHLc2gZ|uhdE-so{akOhuWyQix(GNyy$-FB7a902~}5abQgAvnb4|syfMj8jdiPTTf4I3y(?EL zW>v+{O{*fQin~K(Cp3Zd@eAUE0`D6B<1hGA2XpZ7V_)&p?0*gwdHc=Dl|Ks2gZB>f zloa|WGI6~>1{X-ZebL1i{VWO`HU?FMOR$bQMOKA|CB-Ss!~tNIf5)ExUdXpd7>C4- zP;mQ)$%MHoHsQ{hVn%G>Hr)9}aqtdczLy+)2e9*Ff{y?=W5M3;1>P1O8{#K{oeJO+ zAw}?b;uIhsntToh+*dQhWF+u1?%e4*_%Luu4E`N3C&T7d@dw~(G5nu_o!0^5e+2B5 zeP0NQFQJ%+%?r=xH24;GZreE`$(St`b*DU#PXy-Sl#7#?A6mH4wi7VK2w-;%o(Sx` zzi7`VC@IW`*uV@ZobpM7*}%@uhxmG69$K6c_&%_+1tWhmu=83c4gzzF?X_V6|+ob4G6nt+{pMcfMPY=epK2X^+@#7_V_uVCU|0z2De;%9)JdP)2O zuwCeIoT1`3P&nI9;&$?s<5eqQVP>v%Mo84D4*&i1UD*Z42=*U}u|8JRaC7Si~%-PKhR-1)PP1&>a3x z2bWj~oCl2cZ?E!YP&iwDI;;a0kscVL4w&by5YA=n;SS*85#A+s0y`C-{w=^xNhRhv z!`Yh>w*#Y6hh(XyVjmRF8;ST=z|Jm&xD%L1KqrAWft}3~`FDZKV-n(-BHCj^d~V;{2EIC`K^Od;oizD@z|IMY zI1|{}dJ`7_7tW3ePy&T>h@n9lFpvE9B2vXfU}s-Sz5Zdn$-?*@Nac*W?)(4v}x>%<{)W%EDwV?l5P~^5b7VH_RHM z1Lv9hXAd%eIV+jqI`i->zxrsod1h9zv1N=9t!DCUzu}&U55nf8+5W`4Dus9)y8~ header and a + ; printf implementation. There are no security restrictions, no + ; safeguards, no debugging mechanisms, only what the kernel provides + ; itself. It has absolute and complete power over the + ; machine. + + ; To set up a stack, we set the esp register to point to the top of our + ; stack (as it grows downwards on x86 systems). This is necessarily done + ; in assembly as languages such as C cannot function without a stack. + mov esp, stack_top + + ; This is a good place to initialize crucial processor state before the + ; high-level kernel is entered. It's best to minimize the early + ; environment where crucial features are offline. Note that the + ; processor is not fully initialized yet: Features such as floating + ; point instructions and instruction set extensions are not initialized + ; yet. The GDT should be loaded here. Paging should be enabled here. + ; C++ features such as global constructors and exceptions will require + ; runtime support to work as well. + + ; Enter the high-level kernel. The ABI requires the stack is 16-byte + ; aligned at the time of the call instruction (which afterwards pushes + ; the return pointer of size 4 bytes). The stack was originally 16-byte + ; aligned above and we've since pushed a multiple of 16 bytes to the + ; stack since (pushed 0 bytes so far) and the alignment is thus + ; preserved and the call is well defined. + ; note, that if you are building on Windows, C functions may have "_" prefix in assembly: _kernel_main + extern kernel_main + call kernel_main + + ; If the system has nothing more to do, put the computer into an + ; infinite loop. To do that: + ; 1) Disable interrupts with cli (clear interrupt enable in eflags). + ; They are already disabled by the bootloader, so this is not needed. + ; Mind that you might later enable interrupts and return from + ; kernel_main (which is sort of nonsensical to do). + ; 2) Wait for the next interrupt to arrive with hlt (halt instruction). + ; Since they are disabled, this will lock up the computer. + ; 3) Jump to the hlt instruction if it ever wakes up due to a + ; non-maskable interrupt occurring or due to system management mode. + cli +.hang: hlt + jmp .hang +.end: \ No newline at end of file diff --git a/gems-kernel.git/source/debug.h b/gems-kernel.git/source/debug.h index 6ec512aa4..9771da5d8 100644 --- a/gems-kernel.git/source/debug.h +++ b/gems-kernel.git/source/debug.h @@ -78,5 +78,5 @@ void panic(char deets[128]) { print("\nAre colors working? (Order: Blue,Green,Lightblue,Red,Pink,Orange,White.)\n"); showColors(); print("Regular\n"); - halt(); + halt(1); } diff --git a/gems-kernel.git/source/linker.ld b/gems-kernel.git/source/linker.ld index ff2879da5..269cda129 100644 --- a/gems-kernel.git/source/linker.ld +++ b/gems-kernel.git/source/linker.ld @@ -1,41 +1,52 @@ +/* The bootloader will look at this image and start execution at the symbol + designated as the entry point. */ +ENTRY(_start) + +/* Tell where the various sections of the object files will be put in the final + kernel image. */ SECTIONS { - .text.start (_KERNEL_BASE_) : { -/* link multiboot struct */ -. = ALIGN(8); -KEEP(*(.multiboot)) -/* keep this */ - startup.o( .text ) - } - - .text : ALIGN(0x1000) { -/* link multiboot struct */ -. = ALIGN(8); -KEEP(*(.multiboot)) -/* keep this */ -_TEXT_START_ = .; - *(.text) -_TEXT_END_ = .; - } - - .data : ALIGN(0x1000) { -/* link multiboot struct */ -. = ALIGN(8); -KEEP(*(.multiboot)) -/* keep this */ -_DATA_START_ = .; - *(.data) -_DATA_END_ = .; - } - - .bss : ALIGN(0x1000) { -/* link multiboot struct */ -. = ALIGN(8); -KEEP(*(.multiboot)) -/* keep this */ -_BSS_START_ = .; - *(.bss) -_BSS_END_ = .; - } -} - + /* It used to be universally recommended to use 1M as a start offset, + as it was effectively guaranteed to be available under BIOS systems. + However, UEFI has made things more complicated, and experimental data + strongly suggests that 2M is a safer place to load. In 2016, a new + feature was introduced to the multiboot2 spec to inform bootloaders + that a kernel can be loaded anywhere within a range of addresses and + will be able to relocate itself to run from such a loader-selected + address, in order to give the loader freedom in selecting a span of + memory which is verified to be available by the firmware, in order to + work around this issue. This does not use that feature, so 2M was + chosen as a safer option than the traditional 1M. */ + . = 2M; + + /* First put the multiboot header, as it is required to be put very early + in the image or the bootloader won't recognize the file format. + Next we'll put the .text section. */ + .text BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) + *(.text) + } + + /* Read-only data. */ + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } + + /* Read-write data (initialized) */ + .data BLOCK(4K) : ALIGN(4K) + { + *(.data) + } + + /* Read-write data (uninitialized) and stack */ + .bss BLOCK(4K) : ALIGN(4K) + { + *(COMMON) + *(.bss) + } + + /* The compiler may produce other sections, by default it will put them in + a segment with the same name. Simply add stuff here as needed. */ +} \ No newline at end of file diff --git a/gems-kernel.git/source/os.c b/gems-kernel.git/source/os.c index 7fc2736f0..f91d78bff 100644 --- a/gems-kernel.git/source/os.c +++ b/gems-kernel.git/source/os.c @@ -63,15 +63,15 @@ void os() { while ( 1 == 1 ) { rloadstring("basickeys"); } - panic("RUSHELL-LEVEL CRASH"); } void kern() { //extern bootloader(); //bootloader(); + haltLoop(); clear(lastVGATextColor()); print("GEMS OK, WAITING A FEW TICKS TO TEST TIME... \n"); - wait(100000000); //ok? ok. + wait(10); //ok? ok. beep(); print("Getting frequency of A2 \n"); print("(might be garbled until fixed) \n"); @@ -84,10 +84,6 @@ void kern() { waitSecs(5); clear(); os(); - while (1 == 1) - { - panic("KERNEL-LEVEL CRASH"); - } } int kernel_main(struct multiboot_info* mbd, unsigned int magic) { diff --git a/gems-kernel.git/source/start.s b/gems-kernel.git/source/start.s index 0eb1538b8..269cda129 100644 --- a/gems-kernel.git/source/start.s +++ b/gems-kernel.git/source/start.s @@ -1,53 +1,52 @@ -// We declare the 'kernel_main' label as being external to this file. -// That's because it's the name of the main C function in 'kernel.c'. -.extern kernel_main +/* The bootloader will look at this image and start execution at the symbol + designated as the entry point. */ +ENTRY(_start) -// We declare the 'start' label as global (accessible from outside this file), since the linker will need to know where it is. -// In a bit, we'll actually take a look at the code that defines this label. -.global start +/* Tell where the various sections of the object files will be put in the final + kernel image. */ +SECTIONS +{ + /* It used to be universally recommended to use 1M as a start offset, + as it was effectively guaranteed to be available under BIOS systems. + However, UEFI has made things more complicated, and experimental data + strongly suggests that 2M is a safer place to load. In 2016, a new + feature was introduced to the multiboot2 spec to inform bootloaders + that a kernel can be loaded anywhere within a range of addresses and + will be able to relocate itself to run from such a loader-selected + address, in order to give the loader freedom in selecting a span of + memory which is verified to be available by the firmware, in order to + work around this issue. This does not use that feature, so 2M was + chosen as a safer option than the traditional 1M. */ + . = 2M; -// Our bootloader, GRUB, needs to know some basic information about our kernel before it can boot it. -// We give GRUB this information using a standard known as 'Multiboot'. -// To define a valid 'Multiboot header' that will be recognised by GRUB, we need to hard code some -// constants into the executable. The following code calculates those constants. -.set MB_MAGIC, 0x1BADB002 // This is a 'magic' constant that GRUB will use to detect our kernel's location. -.set MB_FLAGS, (1 << 0) | (1 << 1) // This tells GRUB to 1: load modules on page boundaries and 2: provide a memory map (this is useful later in development) -// Finally, we calculate a checksum that includes all the previous values -.set MB_CHECKSUM, (0 - (MB_MAGIC + MB_FLAGS)) + /* First put the multiboot header, as it is required to be put very early + in the image or the bootloader won't recognize the file format. + Next we'll put the .text section. */ + .text BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) + *(.text) + } -// We now start the section of the executable that will contain our Multiboot header -.section .multiboot - .align 4 // Make sure the following data is aligned on a multiple of 4 bytes - // Use the previously calculated constants in executable code - .long MB_MAGIC - .long MB_FLAGS - // Use the checksum we calculated earlier - .long MB_CHECKSUM + /* Read-only data. */ + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } -// This section contains data initialised to zeroes when the kernel is loaded -.section .bss - // Our C code will need a stack to run. Here, we allocate 4096 bytes (or 4 Kilobytes) for our stack. - // We can expand this later if we want a larger stack. For now, it will be perfectly adequate. - .align 16 - stack_bottom: - .skip 4096 // Reserve a 4096-byte (4K) stack - stack_top: + /* Read-write data (initialized) */ + .data BLOCK(4K) : ALIGN(4K) + { + *(.data) + } -// This section contains our actual assembly code to be run when our kernel loads -.section .text - // Here is the 'start' label we mentioned before. This is the first code that gets run in our kernel. - start: - // First thing's first: we want to set up an environment that's ready to run C code. - // C is very relaxed in its requirements: All we need to do is to set up the stack. - // Please note that on x86, the stack grows DOWNWARD. This is why we start at the top. - mov $stack_top, %esp // Set the stack pointer to the top of the stack + /* Read-write data (uninitialized) and stack */ + .bss BLOCK(4K) : ALIGN(4K) + { + *(COMMON) + *(.bss) + } - // Now we have a C-worthy (haha!) environment ready to run the rest of our kernel. - // At this point, we can call our main C function. - call kernel_main - - // If, by some mysterious circumstances, the kernel's C code ever returns, all we want to do is to hang the CPU - hang: - cli // Disable CPU interrupts - hlt // Halt the CPU - jmp hang // If that didn't work, loop around and try again. + /* The compiler may produce other sections, by default it will put them in + a segment with the same name. Simply add stuff here as needed. */ +} \ No newline at end of file diff --git a/gems-kernel.git/source/time.h b/gems-kernel.git/source/time.h index 512d9cc47..e6877214a 100644 --- a/gems-kernel.git/source/time.h +++ b/gems-kernel.git/source/time.h @@ -1,7 +1,7 @@ //Made to create time at 100000000 TPS //by Sparksammy int time = 1; - +int halted = 0; void countOld() { static long long int i; static int state = 0; @@ -20,12 +20,12 @@ void countOld() { } -void halt() { -// do nothing. +void halt(int halt) { + halted = halt; } void wait(uint32_t millis) { - uint32_t countdown = millis * 1193181.66667; + uint32_t countdown = millis * 1000; while (countdown > 0) { uint32_t countdown = countdown - 1; } @@ -67,3 +67,14 @@ void disableCount() { void enableCount() { countstate = true; } + +void haltLoop() { + while (true) { + if (halted == 0) { + break; + } + if (halted == 1) { + continue; + } + } +} \ No newline at end of file diff --git a/gems-kernel.git/test-mute.sh b/gems-kernel.git/test-mute.sh old mode 100644 new mode 100755