From 5440a1ae61cdba182494c53988efa21129b76b6f Mon Sep 17 00:00:00 2001 From: Elaina Claus Date: Sat, 5 Oct 2024 13:35:39 -0400 Subject: [PATCH] more modularization and updating date in MIT licence header --- include/BIOS/BIOS_sys.inc | 24 +++ include/BIOS/func/E820_memory_map.inc | 161 ++++++++++++++++++ .../{BIOS_func.inc => func/a20enable.inc} | 133 --------------- include/BIOS/func/ext_read.inc | 90 ++++++++++ include/BIOS/func/video.inc | 54 ++++++ include/config.inc | 2 +- include/entry.inc | 10 +- include/{errors.inc => error_codes.inc} | 36 +--- include/fat32/bpb.inc | 2 +- include/memory.inc | 99 +---------- include/partition_table.inc | 21 +-- include/util/error_func.inc | 50 ++++++ src/mbr/mbr.nasm | 2 +- src/stage2/stage2.nasm | 6 +- src/vbr/vbr.nasm | 2 +- 15 files changed, 395 insertions(+), 297 deletions(-) create mode 100644 include/BIOS/BIOS_sys.inc create mode 100644 include/BIOS/func/E820_memory_map.inc rename include/BIOS/{BIOS_func.inc => func/a20enable.inc} (55%) create mode 100644 include/BIOS/func/ext_read.inc create mode 100644 include/BIOS/func/video.inc rename include/{errors.inc => error_codes.inc} (80%) create mode 100644 include/util/error_func.inc diff --git a/include/BIOS/BIOS_sys.inc b/include/BIOS/BIOS_sys.inc new file mode 100644 index 0000000..c453986 --- /dev/null +++ b/include/BIOS/BIOS_sys.inc @@ -0,0 +1,24 @@ +; Copyright (c) 2024 Elaina Claus +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in all +; copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +; SOFTWARE. + +%include 'BIOS/func/a20enable.inc' +%include 'BIOS/func/E820_memory_map.inc' +%include 'BIOS/func/ext_read.inc' +%include 'BIOS/func/video.inc' \ No newline at end of file diff --git a/include/BIOS/func/E820_memory_map.inc b/include/BIOS/func/E820_memory_map.inc new file mode 100644 index 0000000..9cd9231 --- /dev/null +++ b/include/BIOS/func/E820_memory_map.inc @@ -0,0 +1,161 @@ +; Copyright (c) 2024 Elaina Claus +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in all +; copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +; SOFTWARE. + + +; Address Range Descriptor Structure +; +; Offset in Bytes Name Description +; 0 BaseAddrLow Low 32 Bits of Base Address +; 4 BaseAddrHigh High 32 Bits of Base Address +; 8 LengthLow Low 32 Bits of Length in Bytes +; 12 LengthHigh High 32 Bits of Length in Bytes +; 16 Type Address type of this range. +; Address Range Descriptor Structure +; +; Offset in Bytes Name Description +; 0 BaseAddrLow Low 32 Bits of Base Address +; 4 BaseAddrHigh High 32 Bits of Base Address +; 8 LengthLow Low 32 Bits of Length in Bytes +; 12 LengthHigh High 32 Bits of Length in Bytes +; 16 Type Address type of this range. +; Input: +; +; EAX Function Code E820h +; EBX Continuation Contains the "continuation value" to get the +; next run of physical memory. This is the +; value returned by a previous call to this +; routine. If this is the first call, EBX +; must contain zero. +; ES:DI Buffer Pointer Pointer to an Address Range Descriptor +; structure which the BIOS is to fill in. +; ECX Buffer Size The length in bytes of the structure passed +; to the BIOS. The BIOS will fill in at most +; ECX bytes of the structure or however much +; of the structure the BIOS implements. The +; minimum size which must be supported by both +; the BIOS and the caller is 20 bytes. Future +; implementations may extend this structure. +; EDX Signature 'SMAP' - Used by the BIOS to verify the +; caller is requesting the system map +; information to be returned in ES:DI. +; +; Output: +; +; CF Carry Flag Non-Carry - indicates no error +; EAX Signature 'SMAP' - Signature to verify correct BIOS +; revision. +; ES:DI Buffer Pointer Returned Address Range Descriptor pointer. +; Same value as on input. +; ECX Buffer Size Number of bytes returned by the BIOS in the +; address range descriptor. The minimum size +; structure returned by the BIOS is 20 bytes. +; EBX Continuation Contains the continuation value to get the +; next address descriptor. The actual +; significance of the continuation value is up +; to the discretion of the BIOS. The caller +; must pass the continuation value unchanged +; as input to the next iteration of the E820 +; call in order to get the next Address Range +; Descriptor. A return value of zero means that +; this is the last descriptor +; +; Address Range Descriptor Structure +; +; Offset in Bytes Name Description +; 0 BaseAddrLow Low 32 Bits of Base Address +; 4 BaseAddrHigh High 32 Bits of Base Address +; 8 LengthLow Low 32 Bits of Length in Bytes +; 12 LengthHigh High 32 Bits of Length in Bytes +; 16 Type Address type of this range. +; +; The BaseAddrLow and BaseAddrHigh together are the 64 bit BaseAddress of this range. +; The BaseAddress is the physical address of the start of the range being specified. +; +; The LengthLow and LengthHigh together are the 64 bit Length of this range. +; The Length is the physical contiguous length in bytes of a range being specified. +; +; The Type field describes the usage of the described address range as defined in the table below. + +; Value Pneumonic Description +; 1 AddressRangeMemory This run is available RAM usable by the operating system. +; 2 AddressRangeReserved This run of addresses is in use or reserved by the system, and must not be used by the operating system. +; Other Undefined Undefined - Reserved for future use. + +; Address Range Descriptor Structure +; +; Offset in Bytes Name Description +; 0 BaseAddrLow u32 - Low 32 Bits of Base Address +; 4 BaseAddrHigh u32 - High 32 Bits of Base Address +; 8 LengthLow u32 - Low 32 Bits of Length in Bytes +; 12 LengthHigh u32 - High 32 Bits of Length in Bytes +; 16 Type u32 - Address type of this range. +; 20 ExtType u32 - ACPI 3.0 extended type +struc AddressRangeDescStruct_t + .BaseAddrLow resd 1 + .BaseAddrHigh resd 1 + .LengthLow resd 1 + .LengthHigh resd 1 + .Type resd 1 + .ExtType resd 1 +endstruc + +GetMemoryMap: + __CDECL16_ENTRY + push es ; save segment register +.func: + mov dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries], 0 + + mov eax, 0xE820 ; select 0xE820 function + xor ebx, ebx ; Continuation value, 0 for the first call + + mov dx, (BIOSMemoryMap >> 4) + mov es, dx + xor di, di ; (BIOSMemoryMap >> 4):0 makes di an index into BIOSMemoryMap + + mov ecx, AddressRangeDescStruct_t_size + mov edx, 0x534D4150 ; 'SMAP' magic +.loop_L1: + int 0x15 + jc GetMemoryMap.error + cmp eax, 0x534D4150 + jne GetMemoryMap.no_smap_returned +.no_error: + inc dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries] + + cmp ecx, 20 ; TODO: maybe this could be handled better than just panicing + jb GetMemoryMap.nonstandard_e820 ; non-standard entry found + + cmp ebx, 0 + je GetMemoryMap.endp ; 0 in ebx means we have reached the end of memory ranges + + add di, AddressRangeDescStruct_t_size ; increment di to next descriptor + mov edx, eax ; 'SMAP' to edx + mov eax, 0xE820 ; select E820 function + jmp GetMemoryMap.loop_L1 +.error: + ERROR STAGE2_MM_E820_MISC_ERR +.nonstandard_e820: + ERROR STAGE2_MM_E820_NONSTANDARD +.no_smap_returned: + ERROR STAGE2_MM_E820_NO_SMAP +.endp: + pop es + __CDECL16_EXIT + ret \ No newline at end of file diff --git a/include/BIOS/BIOS_func.inc b/include/BIOS/func/a20enable.inc similarity index 55% rename from include/BIOS/BIOS_func.inc rename to include/BIOS/func/a20enable.inc index 64050de..0b18bf5 100644 --- a/include/BIOS/BIOS_func.inc +++ b/include/BIOS/func/a20enable.inc @@ -135,138 +135,5 @@ EnableA20: .endp: pop es pop ds - __CDECL16_EXIT - ret - -; See memory.inc for a brief description of E820 mmap function -GetMemoryMap: - __CDECL16_ENTRY - push es ; save segment register -.func: - mov dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries], 0 - - mov eax, 0xE820 ; select 0xE820 function - xor ebx, ebx ; Continuation value, 0 for the first call - - mov dx, (BIOSMemoryMap >> 4) - mov es, dx - xor di, di ; (BIOSMemoryMap >> 4):0 makes di an index into BIOSMemoryMap - - mov ecx, AddressRangeDescStruct_t_size - mov edx, 0x534D4150 ; 'SMAP' magic -.loop_L1: - int 0x15 - jc GetMemoryMap.error - cmp eax, 0x534D4150 - jne GetMemoryMap.no_smap_returned -.no_error: - inc dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries] - - cmp ecx, 20 ; TODO: maybe this could be handled better than just panicing - jb GetMemoryMap.nonstandard_e820 ; non-standard entry found - - cmp ebx, 0 - je GetMemoryMap.endp ; 0 in ebx means we have reached the end of memory ranges - - add di, AddressRangeDescStruct_t_size ; increment di to next descriptor - mov edx, eax ; 'SMAP' to edx - mov eax, 0xE820 ; select E820 function - jmp GetMemoryMap.loop_L1 -.error: - ERROR STAGE2_MM_E820_MISC_ERR -.nonstandard_e820: - ERROR STAGE2_MM_E820_NONSTANDARD -.no_smap_returned: - ERROR STAGE2_MM_E820_NO_SMAP -.endp: - pop es - __CDECL16_EXIT - ret - -; Wrapper for AH=0x42 INT13h (Extended Read) -; -; BIOS call details -; AH = 42h -; DL = drive number -; DS:SI -> disk address packet -; -; Return: -; CF clear if successful -; AH = 00h -; CF set on error -; AH = error code -; disk address packet's block count field set to number of blocks -; successfully transferred -; -; -; uint8_t read_disk_raw(uint16_t buf_segment, uint16_t buf_offset, uint32_t lba) -; TODO: this needs validation -read_disk_raw: - __CDECL16_ENTRY -.func: - mov ax, 0x10 - push ax ; len = 16 bytes - xor ax, ax - push ax ; val = 0 - mov ax, lba_packet - push ax ; dest = lba_packet address - - call kmemset ; uint8_t* kmemset(void* dest, uint8_t val, size_t len); - add sp, 0x6 - - mov byte [lba_packet + LBAPkt_t.size], 0x10 - mov word [lba_packet + LBAPkt_t.xfer_size], 0x0001 - - mov dword eax, [bp + 8] - mov dword [lba_packet + LBAPkt_t.lower_lba], eax - - mov ax, [bp + 6] - mov word [lba_packet + LBAPkt_t.offset], ax - - mov ax, [bp + 4] - mov word [lba_packet + LBAPkt_t.segment], ax - - mov si, lba_packet - mov ah, 0x42 - mov dl, byte [fat32_ebpb + FAT32_ebpb_t.drive_number_8] - int 0x13 - jnc read_disk_raw.endp - ERROR STAGE2_MBR_DISK_READ_ERROR -.endp: - __CDECL16_EXIT - ret - -; Sets output to 80x25 16 color text mode via BIOS call -; also clears screen -; void SetTextMode(void) -SetTextMode: -.prolog: - __CDECL16_ENTRY - pushf -.func: - xor ah, ah ; Set Video mode BIOS function - mov al, 0x02 ; 16 color 80x25 Text mode - int 0x10 ; Call video interrupt - - mov ah, 0x05 ; Select active display page BIOS function - xor al, al ; page 0 - int 0x10 ; call video interrupt -.endp: - popf - __CDECL16_EXIT - ret - -; disables blinking text mode cursor -disable_cursor: - __CDECL16_ENTRY -.func: - mov dx, 0x3D4 - mov al, 0xA ; low cursor shape register - out dx, al - - inc dx - mov al, 0x20 ; bits 6-7 unused, bit 5 disables the cursor, bits 0-4 control the cursor shape - out dx, al -.endp: __CDECL16_EXIT ret \ No newline at end of file diff --git a/include/BIOS/func/ext_read.inc b/include/BIOS/func/ext_read.inc new file mode 100644 index 0000000..6e137ce --- /dev/null +++ b/include/BIOS/func/ext_read.inc @@ -0,0 +1,90 @@ +; Copyright (c) 2024 Elaina Claus +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in all +; copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +; SOFTWARE. + +;Offset Size Description +; 0 1 size of packet (16 bytes) +; 1 1 always 0 +; 2 2 number of sectors to transfer (max 127 on some BIOSes) +; 4 4 transfer buffer (0xFFFF:0xFFFF) +; 8 4 lower 32-bits of starting 48-bit LBA +; 12 4 upper 32-bits of starting 48-bit LBA +; needs to be aligned to a uint32_t +struc LBAPkt_t + .size resb 1 + .res0 resb 1 + .xfer_size resw 1 + .offset resw 1 + .segment resw 1 + .lower_lba resd 1 + .upper_lba resd 1 +endstruc + +; Wrapper for AH=0x42 INT13h (Extended Read) +; +; BIOS call details +; AH = 42h +; DL = drive number +; DS:SI -> disk address packet +; +; Return: +; CF clear if successful +; AH = 00h +; CF set on error +; AH = error code +; disk address packet's block count field set to number of blocks +; successfully transferred +; +; +; uint8_t read_disk_raw(uint16_t buf_segment, uint16_t buf_offset, uint32_t lba) +; TODO: this needs validation +read_disk_raw: + __CDECL16_ENTRY +.func: + mov ax, 0x10 + push ax ; len = 16 bytes + xor ax, ax + push ax ; val = 0 + mov ax, lba_packet + push ax ; dest = lba_packet address + + call kmemset ; uint8_t* kmemset(void* dest, uint8_t val, size_t len); + add sp, 0x6 + + mov byte [lba_packet + LBAPkt_t.size], 0x10 + mov word [lba_packet + LBAPkt_t.xfer_size], 0x0001 + + mov dword eax, [bp + 8] + mov dword [lba_packet + LBAPkt_t.lower_lba], eax + + mov ax, [bp + 6] + mov word [lba_packet + LBAPkt_t.offset], ax + + mov ax, [bp + 4] + mov word [lba_packet + LBAPkt_t.segment], ax + + mov si, lba_packet + mov ah, 0x42 + mov dl, byte [fat32_ebpb + FAT32_ebpb_t.drive_number_8] + int 0x13 + jnc read_disk_raw.endp + ERROR STAGE2_MBR_DISK_READ_ERROR +.endp: + __CDECL16_EXIT + ret \ No newline at end of file diff --git a/include/BIOS/func/video.inc b/include/BIOS/func/video.inc new file mode 100644 index 0000000..5a5e78e --- /dev/null +++ b/include/BIOS/func/video.inc @@ -0,0 +1,54 @@ +; Copyright (c) 2024 Elaina Claus +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in all +; copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +; SOFTWARE. + +; Sets output to 80x25 16 color text mode via BIOS call +; also clears screen +; void SetTextMode(void) +SetTextMode: +.prolog: + __CDECL16_ENTRY + pushf +.func: + xor ah, ah ; Set Video mode BIOS function + mov al, 0x02 ; 16 color 80x25 Text mode + int 0x10 ; Call video interrupt + + mov ah, 0x05 ; Select active display page BIOS function + xor al, al ; page 0 + int 0x10 ; call video interrupt +.endp: + popf + __CDECL16_EXIT + ret + +; disables blinking text mode cursor +disable_cursor: + __CDECL16_ENTRY +.func: + mov dx, 0x3D4 + mov al, 0xA ; low cursor shape register + out dx, al + + inc dx + mov al, 0x20 ; bits 6-7 unused, bit 5 disables the cursor, bits 0-4 control the cursor shape + out dx, al +.endp: + __CDECL16_EXIT + ret \ No newline at end of file diff --git a/include/config.inc b/include/config.inc index 20e2430..3a780f6 100755 --- a/include/config.inc +++ b/include/config.inc @@ -1,4 +1,4 @@ -; Copyright (c) 2023 Elaina Claus +; Copyright (c) 2024 Elaina Claus ; ; Permission is hereby granted, free of charge, to any person obtaining a copy ; of this software and associated documentation files (the "Software"), to deal diff --git a/include/entry.inc b/include/entry.inc index f9f566e..f295305 100755 --- a/include/entry.inc +++ b/include/entry.inc @@ -1,4 +1,4 @@ -; Copyright (c) 2023 Elaina Claus +; Copyright (c) 2024 Elaina Claus ; ; Permission is hereby granted, free of charge, to any person obtaining a copy ; of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ ; 8KiB from 0x2500 -> 0x500 -%define STACK_START 0x2500 -%define MBR_ENTRY 0x7A00 -%define VBR_ENTRY 0x7C00 -%define STAGE2_ENTRY 0x7E00 \ No newline at end of file +%define EARLY_STACK_START 0x2500 +%define MBR_ENTRY 0x7A00 +%define VBR_ENTRY 0x7C00 +%define STAGE2_ENTRY 0x7E00 \ No newline at end of file diff --git a/include/errors.inc b/include/error_codes.inc similarity index 80% rename from include/errors.inc rename to include/error_codes.inc index 82da97d..bc1999c 100755 --- a/include/errors.inc +++ b/include/error_codes.inc @@ -1,4 +1,4 @@ -; Copyright (c) 2023 Elaina Claus +; Copyright (c) 2024 Elaina Claus ; ; Permission is hereby granted, free of charge, to any person obtaining a copy ; of this software and associated documentation files (the "Software"), to deal @@ -76,36 +76,4 @@ %define STEVIA_DEBUG_OK 'W' %define STEVIA_DEBUG_ERR 'X' %define STEVIA_DEBUG_UNIMPLEMENTED 'Y' -%define STEVIA_DEBUG_HALT 'Z' - - -%macro ERROR 1 - xor ax, ax - mov al, %1 - jmp error -%endmacro - -; pass error as ascii character in al, errors a-zA-Z or 0-9 -error: - ; fs = 0xb800 => fs:0x0000 = 0xb8000 - mov dx, 0xB800 - mov fs, dx - - mov dx, STEVIA_DEBUG_OK - cmp ax, dx - jge error.debug_err - mov dh, 0x4F ; color 0x4F is white text/red background - jmp error.print -.debug_err: - mov dh, 0x5F ; debug case is white text/purple background - - ; the characters are two bytes in the order of 0xb8000: byte c, byte attribute - ; since x86 is le, we store the attribute in the MSB of dx -.print: - mov dl, al - mov word [fs:0x0000], dx - jmp error.stop - -.stop: - hlt - jmp short error.stop \ No newline at end of file +%define STEVIA_DEBUG_HALT 'Z' \ No newline at end of file diff --git a/include/fat32/bpb.inc b/include/fat32/bpb.inc index e6ce621..8200b34 100755 --- a/include/fat32/bpb.inc +++ b/include/fat32/bpb.inc @@ -1,4 +1,4 @@ -; Copyright (c) 2023 Elaina Claus +; Copyright (c) 2024 Elaina Claus ; ; Permission is hereby granted, free of charge, to any person obtaining a copy ; of this software and associated documentation files (the "Software"), to deal diff --git a/include/memory.inc b/include/memory.inc index 7f0e15b..68e1305 100755 --- a/include/memory.inc +++ b/include/memory.inc @@ -1,4 +1,4 @@ -; Copyright (c) 2023 Elaina Claus +; Copyright (c) 2024 Elaina Claus ; ; Permission is hereby granted, free of charge, to any person obtaining a copy ; of this software and associated documentation files (the "Software"), to deal @@ -110,103 +110,6 @@ struc SteviaInfoStruct_t .EBPBDataPtr resd 1 endstruc -; Address Range Descriptor Structure -; -; Offset in Bytes Name Description -; 0 BaseAddrLow Low 32 Bits of Base Address -; 4 BaseAddrHigh High 32 Bits of Base Address -; 8 LengthLow Low 32 Bits of Length in Bytes -; 12 LengthHigh High 32 Bits of Length in Bytes -; 16 Type Address type of this range. -; Address Range Descriptor Structure -; -; Offset in Bytes Name Description -; 0 BaseAddrLow Low 32 Bits of Base Address -; 4 BaseAddrHigh High 32 Bits of Base Address -; 8 LengthLow Low 32 Bits of Length in Bytes -; 12 LengthHigh High 32 Bits of Length in Bytes -; 16 Type Address type of this range. -; Input: -; -; EAX Function Code E820h -; EBX Continuation Contains the "continuation value" to get the -; next run of physical memory. This is the -; value returned by a previous call to this -; routine. If this is the first call, EBX -; must contain zero. -; ES:DI Buffer Pointer Pointer to an Address Range Descriptor -; structure which the BIOS is to fill in. -; ECX Buffer Size The length in bytes of the structure passed -; to the BIOS. The BIOS will fill in at most -; ECX bytes of the structure or however much -; of the structure the BIOS implements. The -; minimum size which must be supported by both -; the BIOS and the caller is 20 bytes. Future -; implementations may extend this structure. -; EDX Signature 'SMAP' - Used by the BIOS to verify the -; caller is requesting the system map -; information to be returned in ES:DI. -; -; Output: -; -; CF Carry Flag Non-Carry - indicates no error -; EAX Signature 'SMAP' - Signature to verify correct BIOS -; revision. -; ES:DI Buffer Pointer Returned Address Range Descriptor pointer. -; Same value as on input. -; ECX Buffer Size Number of bytes returned by the BIOS in the -; address range descriptor. The minimum size -; structure returned by the BIOS is 20 bytes. -; EBX Continuation Contains the continuation value to get the -; next address descriptor. The actual -; significance of the continuation value is up -; to the discretion of the BIOS. The caller -; must pass the continuation value unchanged -; as input to the next iteration of the E820 -; call in order to get the next Address Range -; Descriptor. A return value of zero means that -; this is the last descriptor -; -; Address Range Descriptor Structure -; -; Offset in Bytes Name Description -; 0 BaseAddrLow Low 32 Bits of Base Address -; 4 BaseAddrHigh High 32 Bits of Base Address -; 8 LengthLow Low 32 Bits of Length in Bytes -; 12 LengthHigh High 32 Bits of Length in Bytes -; 16 Type Address type of this range. -; -; The BaseAddrLow and BaseAddrHigh together are the 64 bit BaseAddress of this range. -; The BaseAddress is the physical address of the start of the range being specified. -; -; The LengthLow and LengthHigh together are the 64 bit Length of this range. -; The Length is the physical contiguous length in bytes of a range being specified. -; -; The Type field describes the usage of the described address range as defined in the table below. - -; Value Pneumonic Description -; 1 AddressRangeMemory This run is available RAM usable by the operating system. -; 2 AddressRangeReserved This run of addresses is in use or reserved by the system, and must not be used by the operating system. -; Other Undefined Undefined - Reserved for future use. - -; Address Range Descriptor Structure -; -; Offset in Bytes Name Description -; 0 BaseAddrLow u32 - Low 32 Bits of Base Address -; 4 BaseAddrHigh u32 - High 32 Bits of Base Address -; 8 LengthLow u32 - Low 32 Bits of Length in Bytes -; 12 LengthHigh u32 - High 32 Bits of Length in Bytes -; 16 Type u32 - Address type of this range. -; 20 ExtType u32 - ACPI 3.0 extended type -struc AddressRangeDescStruct_t - .BaseAddrLow resd 1 - .BaseAddrHigh resd 1 - .LengthLow resd 1 - .LengthHigh resd 1 - .Type resd 1 - .ExtType resd 1 -endstruc - %macro DEBUG_HCF 0 DEBUG_LOOP: hlt diff --git a/include/partition_table.inc b/include/partition_table.inc index 5fc7a20..7f149fa 100755 --- a/include/partition_table.inc +++ b/include/partition_table.inc @@ -1,4 +1,4 @@ -; Copyright (c) 2023 Elaina Claus +; Copyright (c) 2024 Elaina Claus ; ; Permission is hereby granted, free of charge, to any person obtaining a copy ; of this software and associated documentation files (the "Software"), to deal @@ -41,23 +41,4 @@ struc PartTable_t .partition2 resb 16 .partition3 resb 16 .partition4 resb 16 -endstruc - - -;Offset Size Description -; 0 1 size of packet (16 bytes) -; 1 1 always 0 -; 2 2 number of sectors to transfer (max 127 on some BIOSes) -; 4 4 transfer buffer (0xFFFF:0xFFFF) -; 8 4 lower 32-bits of starting 48-bit LBA -; 12 4 upper 32-bits of starting 48-bit LBA -; needs to be aligned to a uint32_t -struc LBAPkt_t - .size resb 1 - .res0 resb 1 - .xfer_size resw 1 - .offset resw 1 - .segment resw 1 - .lower_lba resd 1 - .upper_lba resd 1 endstruc \ No newline at end of file diff --git a/include/util/error_func.inc b/include/util/error_func.inc new file mode 100644 index 0000000..cbd238a --- /dev/null +++ b/include/util/error_func.inc @@ -0,0 +1,50 @@ +; Copyright (c) 2024 Elaina Claus +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in all +; copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +; SOFTWARE. + +%macro ERROR 1 + xor ax, ax + mov al, %1 + jmp error +%endmacro + +; pass error as ascii character in al, errors a-zA-Z or 0-9 +error: + ; fs = 0xb800 => fs:0x0000 = 0xb8000 + mov dx, 0xB800 + mov fs, dx + + mov dx, STEVIA_DEBUG_OK + cmp ax, dx + jge error.debug_err + mov dh, 0x4F ; color 0x4F is white text/red background + jmp error.print +.debug_err: + mov dh, 0x5F ; debug case is white text/purple background + + ; the characters are two bytes in the order of 0xb8000: byte c, byte attribute + ; since x86 is le, we store the attribute in the MSB of dx +.print: + mov dl, al + mov word [fs:0x0000], dx + jmp error.stop + +.stop: + hlt + jmp short error.stop \ No newline at end of file diff --git a/src/mbr/mbr.nasm b/src/mbr/mbr.nasm index 1d14927..f65a202 100755 --- a/src/mbr/mbr.nasm +++ b/src/mbr/mbr.nasm @@ -33,7 +33,7 @@ init: mov es, ax ; * mov ss, ax ; Set Stack Segment to 0 - mov sp, STACK_START + mov sp, EARLY_STACK_START mov ch, 0x01 ; 256 WORDs in MBR (512 bytes), 0x0100 in cx mov si, 0x7C00 ; Current MBR Address (loaded here by BIOS) diff --git a/src/stage2/stage2.nasm b/src/stage2/stage2.nasm index e061f9c..5fad4a8 100755 --- a/src/stage2/stage2.nasm +++ b/src/stage2/stage2.nasm @@ -38,7 +38,7 @@ init: mov gs, ax ; * mov ss, ax ; Set Stack Segment to 0 - mov sp, STACK_START ; Set Stack Pointer + mov sp, EARLY_STACK_START ; Set Stack Pointer add sp, 0x4 mov ax, 0xDEAD @@ -52,7 +52,7 @@ init: jmp 0:main %include "config.inc" -%include "errors.inc" +%include "error_codes.inc" %include "memory.inc" %include "kmem_func.inc" %include "partition_table.inc" @@ -146,7 +146,7 @@ hcf: ; ; ############### -%include 'BIOS/BIOS_func.inc' +%include 'BIOS/BIOS_sys.inc' ; ############################## ; diff --git a/src/vbr/vbr.nasm b/src/vbr/vbr.nasm index ebb8b71..37759ca 100755 --- a/src/vbr/vbr.nasm +++ b/src/vbr/vbr.nasm @@ -40,7 +40,7 @@ init: mov es, ax ; * mov ss, ax ; Set Stack Segment to 0 - mov sp, STACK_START ; Setup stack + mov sp, EARLY_STACK_START ; Setup stack mov bp, sp ; base ptr = stack ptr mov bx, VBR_ENTRY ; move Bx to the new start of the initial boot sector