NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: install/42202 (boot installcd fails ((amd64/i386))
The following reply was made to PR install/42202; it has been noted by GNATS.
From: Izumi Tsutsui <tsutsui%ceres.dti.ne.jp@localhost>
To: gnats-bugs%NetBSD.org@localhost, jmcneill%NetBSD.org@localhost
Cc: njoly%pasteur.fr@localhost, gnats-admin%NetBSD.org@localhost,
netbsd-bugs%NetBSD.org@localhost,
kosaki_kt%ybb.ne.jp@localhost, tsutsui%ceres.dti.ne.jp@localhost
Subject: Re: install/42202 (boot installcd fails ((amd64/i386))
Date: Sat, 24 Oct 2009 07:24:43 +0900
I wrote:
> The real fix is to update cdboot.S to support real <-> protect mode
> switches provided by i386/stand/lib/realprot.S, which is already used
> by other primary bootxx loaders.
Ah, no. The problem depends on implementation of INT 13h function 42h
(some BIOSes might handle it properly though), so we might have to
split a large xfer within 64KB in read_sectors function.
The attached dumb patch (checks and split >64KB xfers)
seems to work around even with ~67KB /boot on my machine.
(though I'm not familiar with x86 asm at all)
---
Index: stand/cdboot/cdboot.S
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/cdboot/cdboot.S,v
retrieving revision 1.8
diff -u -r1.8 cdboot.S
--- stand/cdboot/cdboot.S 3 May 2008 13:07:31 -0000 1.8
+++ stand/cdboot/cdboot.S 23 Oct 2009 22:12:50 -0000
@@ -47,6 +47,9 @@
#define PVD_ADDR 0x1000 /* Where Primary VD is loaded */
#define ROOTDIR_ADDR 0x1800 /* Where Root Directory is loaded */
#define LOADER_ADDR SECONDARY_LOAD_ADDRESS
+#define SEGMENT_SIZE 0x10000
+#define MAX_NBLOCK (SEGMENT_SIZE / BLOCK_SIZE)
+#define NEXT_SEGMENT (SEGMENT_SIZE >> 4)
#ifdef BOOT_FROM_FAT
#define MBR_AFTERBPB 90 /* BPB size in FAT32 partition BR */
@@ -297,16 +300,33 @@
*/
read_sectors:
pusha
- movl %eax, edd_lba /* Convert LBA to segment */
shrl $4, %ebx
+read_again:
+ movl %eax, edd_lba /* Convert LBA to segment */
movw %bx, edd_segment
+ pushl %eax
+ push %bx
+ push %dx
+ cmpb $MAX_NBLOCK, %dh
+ jle 1f
+ movb $MAX_NBLOCK, %dh
+1:
movb %dh, edd_nsecs
movb boot_drive, %dl
movw $edd_packet, %si
-read_again:
movb $0x42, %ah
int $0x13
+ pop %dx
+ pop %bx
+ popl %eax
jc read_fail
+ cmpb $MAX_NBLOCK, %dh
+ jle 2f
+ subb $MAX_NBLOCK, %dh
+ addl $MAX_NBLOCK, %eax
+ addw $NEXT_SEGMENT, %bx
+ jmp read_again
+2:
popa
ret
read_fail:
---
Izumi Tsutsui
Home |
Main Index |
Thread Index |
Old Index