diff --git a/boot/elf/elf.c b/boot/elf/elf.c new file mode 100644 index 0000000..5ce83ac --- /dev/null +++ b/boot/elf/elf.c @@ -0,0 +1,10 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: ELF64 Parser and Loader // +//----------------------------------------------------------------------------// + + diff --git a/boot/loader.asm b/boot/loader.asm index 5ec173a..7d7b9df 100644 --- a/boot/loader.asm +++ b/boot/loader.asm @@ -33,13 +33,6 @@ %define volumeLabel bp+0x2b ; Volume Label %define fatTypeLabel bp+0x36 ; File system type -;; DISK BUFFER "SEGMENT" -%define BUFFER_SEG 0x07c0 ; (BUFFER_SEG << 4) + BUFFER_OFF = 0x07C00 -%define BUFFER_OFF 0x0000 - -;; SECOND STAGE LOADER "SEGMENT" -%define LOAD_SEG LONG_SELECTOR-GDT64 ; (LOAD_SEG << 4) + LOAD_OFF = 0x070000 -%define LOAD_OFF Kernel [BITS 16] @@ -56,13 +49,13 @@ jmp 0x0000:main ;; GDT WITH DOC GDT64: NULL_SELECTOR: ;; null selector within 64 bits - dw GDT_LENGTH ; limit of GDT - dw GDT64 ; linear address of GDT - dd 0x0 ; + dw GDT_LENGTH ; limit of GDT + dw GDT64 ; linear address of GDT + dd 0x0 ; CODE_SELECTOR: ;; 32-bit code selector (ring 0) - dw 0x0FFFF ; Segment Limit - db 0x0, 0x0, 0x0 ; Base Address + dw 0x0000FFFF ; Segment Limit + db 0x0, 0x0, 0x0 ; Base Address db 10011010b ; |7|6|5|4|3|2|1|0| ; | | | | | | | `----- 1 when segment used. ; | | | | | | `------ 1 when writable. @@ -72,7 +65,7 @@ GDT64: ; | | `---------- DPL !!! 0 for ring 0 ; | `----------- DPL (2/2) ; `------------ 1 if in physical memory, 0 if page fault - db 11001111b ; |7|6|5|4|3|2|1|0| + db 11001111b ; |7|6|5|4|3|2|1|0| ; | | | | | | | `----- Limit 16 ; | | | | | | `------ Limit 17 ; | | | | | `------- Limit 18 @@ -81,11 +74,11 @@ GDT64: ; | | `---------- 0 always ; | `----------- size of data. 1 for 32bits ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) - db 0x0 ; Base Address + db 0x0 ; Base Address DATA_SELECTOR: ;; flat data selector (ring 0) - dw 0x0FFFF ; Segment Limit - db 0x0, 0x0, 0x0 ; Base Address + dw 0x0000FFFF ; Segment Limit + db 0x0, 0x0, 0x0 ; Base Address db 10010010b ; |7|6|5|4|3|2|1|0| ; | | | | | | | `----- 1 when segment used. ; | | | | | | `------ 1 when writable. @@ -95,7 +88,7 @@ GDT64: ; | | `---------- DPL !!! 0 for ring 0 ; | `----------- DPL (2/2) ; `------------ 1 if in physical memory, 0 if page fault - db 10001111b ; |7|6|5|4|3|2|1|0| + db 10001111b ; |7|6|5|4|3|2|1|0| ; | | | | | | | `----- Limit 16 ; | | | | | | `------ Limit 17 ; | | | | | `------- Limit 18 @@ -104,11 +97,11 @@ GDT64: ; | | `---------- 0 always ; | `----------- size of data. 1 for 32bits ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) - db 0x0 ; Base Address + db 0x0 ; Base Address LONG_SELECTOR: ;; 64-bit code selector (ring 0) - dw 0x0FFFF ; Segment Limit - db 0x0, 0x0, 0x0 ; Base Address + dw 0x0000FFFF ; Segment Limit + db 0x0, 0x0, 0x0 ; Base Address db 10011010b ; |7|6|5|4|3|2|1|0| ; | | | | | | | `----- 1 when segment used. ; | | | | | | `------ 1 when writable. @@ -118,7 +111,7 @@ GDT64: ; | | `---------- DPL !!! 0 for ring 0 ; | `----------- DPL (2/2) ; `------------ 1 if in physical memory, 0 if page fault - db 10101111b ; |7|6|5|4|3|2|1|0| + db 10101111b ; |7|6|5|4|3|2|1|0| ; | | | | | | | `----- Limit 16 ; | | | | | | `------ Limit 17 ; | | | | | `------- Limit 18 @@ -127,7 +120,7 @@ GDT64: ; | | `---------- 0 always ; | `----------- size of data. 1 for 32bits ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) - db 0x0 ; Base Address + db 0x0 ; Base Address GDT_LENGTH: %include "boot/loader16.inc" @@ -195,6 +188,21 @@ main32: pop dword [VGA_HEIGHT32] pop dword [VIDEO_MODE32] + ;; VERIFY A20 + pushad + mov edi,0x112345 ;odd megabyte address. + mov esi,0x012345 ;even megabyte address. + mov [esi],esi ;making sure that both addresses contain diffrent values. + mov [edi],edi ;(if A20 line is cleared the two pointers would point to the address 0x012345 that would contain 0x112345 (edi)) + cmpsd ;compare addresses to see if the're equivalent. + popad + jne .A20_on ;if not equivalent , A20 line is set. + mov WORD [A20_OK], 0 + jmp .A20_end +.A20_on: + mov BYTE [A20_OK], 1 +.A20_end: + ;; INITIALIZE PROTECTED MODE SEGMENT REGISTERS mov ax, DATA_SELECTOR-GDT64 mov ds, ax @@ -260,6 +268,7 @@ KernSearch db 0x09, " Loading the Kernel in RAM...", 0 txt db 0x09, " Switching to Long Mode... ", 0 Reinit db "Booting OS/K !", 0x0D, 0x0A, 0x0D, 0x0A, 0 Pass db " OK", 0x0A, 0x0D, 0 +Fail db " FAIL!", 0x0A, 0x0D, 0 msg db "The system is now in x64 mode. Is this not beautiful ?", 0x0A, 0x0D, 0 NoLongMode db 0x0A, 0x0D, "ERROR : Your computer is not designed for x64 OS", 0 @@ -278,6 +287,7 @@ NextTRAM dq 0x0B8000 ; Last position of cursor VIDEO_MODE64 dq 0 VGA_HEIGHT64 dq 0 VGA_X dq 0 +A20_OK db 0 main64: pop qword [VGA_HEIGHT64] @@ -304,18 +314,17 @@ main64: mov esi, EnA20 call write + cmp BYTE [A20_OK], 1 + je .A20Success + mov bl, 0x0C + mov esi, Fail + call write + jmp Die +.A20Success: mov bl, 0x0A mov esi, Pass call write - mov bl, 0x0F - mov esi, KernSearch - call write - - mov bl, 0x0A - mov esi, Pass - call write - mov bl, 0x0F mov esi, txt call write @@ -328,6 +337,7 @@ main64: mov esi, msg call write + jmp Die ; times 1024 nop diff --git a/build/bin/disk.img b/build/bin/disk.img index 10b049d..b2b0af2 100644 Binary files a/build/bin/disk.img and b/build/bin/disk.img differ diff --git a/build/bin/loader.bin b/build/bin/loader.bin index 011e0e7..02ebbd0 100644 Binary files a/build/bin/loader.bin and b/build/bin/loader.bin differ diff --git a/build/obj/boot/loader.bin b/build/obj/boot/loader.bin index 011e0e7..02ebbd0 100644 Binary files a/build/obj/boot/loader.bin and b/build/obj/boot/loader.bin differ