Module Name: src
Committed By: dsl
Date: Sat Oct 24 11:23:07 UTC 2009
Modified Files:
src/sys/arch/i386/stand/cdboot: cdboot.S
Log Message:
Support reading /boot > 64k. Based on the patch from Izumi Tsutsui.
Compiles but not actually tested! Fixes PR/42202
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/i386/stand/cdboot/cdboot.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/i386/stand/cdboot/cdboot.S
diff -u src/sys/arch/i386/stand/cdboot/cdboot.S:1.9 src/sys/arch/i386/stand/cdboot/cdboot.S:1.10
--- src/sys/arch/i386/stand/cdboot/cdboot.S:1.9 Sat Oct 24 10:28:30 2009
+++ src/sys/arch/i386/stand/cdboot/cdboot.S Sat Oct 24 11:23:06 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: cdboot.S,v 1.9 2009/10/24 10:28:30 dsl Exp $ */
+/* $NetBSD: cdboot.S,v 1.10 2009/10/24 11:23:06 dsl Exp $ */
/*-
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -33,9 +33,6 @@
* This is a primary boot loader that loads a secondary boot loader
* directly from CD without performing floppy/hard disk emulation as
* described by the El Torito specification.
- *
- * TODO:
- * - Support for loading secondary boot loader > 64kB
*/
#include <machine/asm.h>
@@ -302,21 +299,34 @@
* %eax = LBA of starting sector
* %ebx = buffer to store sectors
* %dh = number of sectors to read
+ *
+ * Long transfers are split onto multiple 64k reads
*/
+#define MAX_SECTORS (0x10000/BLOCK_SIZE)
read_sectors:
- pusha
+ pushal
movl %eax, edd_lba
shrl $4, %ebx /* Convert buffer addr to seg:0 */
movw %bx, edd_segment
- movb %dh, edd_nsecs
- movb boot_drive, %dl
+1: movb %dh, edd_nsecs
+ cmpb $MAX_SECTORS, %dh
+ jle 2f /* j if less than 64k */
+ movb $MAX_SECTORS, edd_nsecs /* Read 16 sectors - 64k bytes */
+2: movb boot_drive, %dl
movw $edd_packet, %si
read_again:
movb $0x42, %ah
+ push %dx /* bios shouldn't kill %dh, but ... */
int $0x13
+ pop %dx /* ... better safe than sorry! */
jc read_fail
- popa
+ addw $0x1000, edd_segment /* Advance segment addr by 64k bytes */
+ addl $MAX_SECTORS, edd_lba /* And sector number to match */
+ sub edd_nsecs, %dh /* Number of sectors remaining */
+ jnz 1b
+ popal
ret
+
read_fail:
cmpb $ERROR_TIMEOUT, %ah
jz read_again
@@ -324,17 +334,6 @@
call message
jmp panic
-/*
- * For debugging purpose
- */
-put_char:
- pusha
- movb $0x0e, %ah
- movw $0x0001, %bx
- int $0x10
- popa
- ret
-
#include <message.S>
edd_packet: