From 1ead86ef708af2ad00ef221111603f814205c7a1 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Thu, 5 Nov 2020 17:00:15 +0100 Subject: [PATCH] bootsect: Do not assume 512-byte sectors --- bootsect/bootsect.asm | 6 ++--- bootsect/disk.inc | 55 ++++++++++++++++++++++++------------------ limine-install.c | 13 ++++++---- limine.bin | Bin 32768 -> 32768 bytes 4 files changed, 43 insertions(+), 31 deletions(-) diff --git a/bootsect/bootsect.asm b/bootsect/bootsect.asm index 9bb11a3e..466e4f2f 100644 --- a/bootsect/bootsect.asm +++ b/bootsect/bootsect.asm @@ -54,11 +54,11 @@ start: ; make sure that is the case now. mov esp, 0x7c00 - push 0x7000 + push 0x6fe0 pop es mov eax, dword [stage2_sector] xor bx, bx - mov cx, 63 + mov ecx, 32768 call read_sectors jc err @@ -112,7 +112,7 @@ vector: bits 16 times 0x1b0-($-$$) db 0 -stage2_sector: dd 1 +stage2_sector: dd 0 times 0x1b8-($-$$) db 0 times 510-($-$$) db 0 diff --git a/bootsect/disk.inc b/bootsect/disk.inc index ecb2acaa..0886dbef 100644 --- a/bootsect/disk.inc +++ b/bootsect/disk.inc @@ -7,7 +7,7 @@ ; DL = Drive number ; ES = Buffer segment ; BX = Buffer offset -; CX = Sectors count +; ECX = Byte count ; OUT: ; Carry if error @@ -15,40 +15,49 @@ read_sectors: pusha - push es - pop word [.target_segment] - mov word [.target_offset], bx - mov dword [.lba_address_low], eax + mov esi, .da_struct - mov word [.countdown], cx + mov word [si], 16 + mov word [si+2], 1 + mov word [si+4], bx + mov word [si+6], es + mov dword [si+8], eax + mov dword [si+12], 0 + + ; Get bytes per sector + push dx + push si + mov ah, 0x48 + mov si, .drive_params + mov word [si], 30 ; buf_size + int 0x13 + jc .done + mov bp, word [si+24] ; bytes_per_sect + mov ax, cx + shr ecx, 16 + mov dx, cx + xor cx, cx + div bp + test dx, dx + adc cx, ax + pop si + pop dx .loop: - mov esi, .da_struct mov ah, 0x42 clc int 0x13 jc .done - add word [.target_offset], 512 - inc dword [.lba_address_low] + add word [si+4], bp + inc dword [si+8] - dec word [.countdown] - jnz .loop + loop .loop .done: popa ret -align 2 - .countdown: dw 0 - -align 4 - .da_struct: - .packet_size db 16 - .unused db 0 - .count dw 1 - .target_offset dw 0 - .target_segment dw 0 - .lba_address_low dd 0 - .lba_address_high dd 0 + .da_struct: equ 0x8000 + .drive_params: equ 0x8010 diff --git a/limine-install.c b/limine-install.c index dc4fe6d9..9a73c50b 100644 --- a/limine-install.c +++ b/limine-install.c @@ -8,10 +8,10 @@ int main(int argc, char *argv[]) { FILE *bootloader_file, *device; uint8_t *bootloader_img; uint8_t orig_mbr[70], timestamp[6]; - uint32_t stage2_sect; + uint32_t stage2_sect, sect_size; if (argc < 3) { - printf("Usage: %s [stage2 start sector]\n", argv[0]); + printf("Usage: %s [ ]\n", argv[0]); return 1; } @@ -41,9 +41,12 @@ int main(int argc, char *argv[]) { return 1; } - stage2_sect = 1; + stage2_sect = 0; + sect_size = 512; if (argc >= 4) sscanf(argv[3], "%" SCNu32, &stage2_sect); + if (argc >= 5) + sscanf(argv[4], "%" SCNu32, §_size); // Save original timestamp fseek(device, 218, SEEK_SET); @@ -58,8 +61,8 @@ int main(int argc, char *argv[]) { fwrite(&bootloader_img[0], 1, 512, device); // Write the rest of stage 2 to the device - fseek(device, stage2_sect * 512, SEEK_SET); - fwrite(&bootloader_img[512], 63, 512, device); + fseek(device, stage2_sect * sect_size, SEEK_SET); + fwrite(&bootloader_img[0], 64, 512, device); // Hardcode in the bootsector the location of stage 2 fseek(device, 0x1b0, SEEK_SET); diff --git a/limine.bin b/limine.bin index e22d3f3cba1bc39c4e86df257b7e704dc051b714..3ff7b9048659c79cd7b4e7b6a9a98463a9199064 100644 GIT binary patch delta 223 zcmZo@U}|V!n$T$E+xR}d-()EeGS+sV+t!0^JJp-AV&B!*x7 z3J3Uiy|?@Nzeh`11NMkVFLuZ2fFfwViSj zwP}lGYCHLaYSZ?K)G{z^ar$vqxJa0t}2OrX;W} z