[syslinux] [PATCH] memdisk: Use boot_lba logic for booting an offset within the di
Shao Miller
Shao.Miller at yrdsb.edu.on.ca
Thu Nov 19 18:02:48 PST 2009
The previous MEMDISK El Torito code merge did not actually work without
this.
Signed-off-by: Shao Miller <shao.miller at yrdsb.edu.on.ca>
---
memdisk/setup.c | 17 +++++++++--------
1 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/memdisk/setup.c b/memdisk/setup.c
index 40f3f8c..5a45f39 100644
--- a/memdisk/setup.c
+++ b/memdisk/setup.c
@@ -338,6 +338,7 @@ struct geometry {
uint32_t sectors; /* Sector count */
uint32_t c, h, s; /* C/H/S geometry */
uint32_t offset; /* Byte offset for disk */
+ uint32_t boot_lba; /* LBA of bootstrap code */
uint8_t type; /* Type byte for INT 13h AH=08h */
uint8_t driveno; /* Drive no */
uint16_t sector_size; /* Sector size in bytes (512 vs. 2048) */
@@ -451,6 +452,9 @@ static const struct geometry
*get_disk_image_geometry(uint32_t where,
/* If we have an emulation mode, set the offset to the image */
if (boot_cat->initial_entry.media_type)
hd_geometry.offset += boot_cat->initial_entry.load_block * 2048;
+ else
+ /* We're a no-emulation mode, so we will boot to an offset */
+ hd_geometry.boot_lba = boot_cat->initial_entry.load_block * 4;
if (boot_cat->initial_entry.media_type < 4) {
/* We're a floppy emulation mode or our params will be
* overwritten by the no emulation mode case
@@ -831,7 +835,6 @@ void setup(const struct real_mode_args *rm_args_ptr)
int no_bpt; /* No valid BPT presented */
uint32_t boot_seg = 0; /* Meaning 0000:7C00 */
uint32_t boot_len = 512; /* One sector */
- uint32_t boot_lba = 0; /* LBA of bootstrap code */
/* We need to copy the rm_args into their proper place */
memcpy(&rm_args, rm_args_ptr, sizeof rm_args);
@@ -1027,11 +1030,12 @@ void setup(const struct real_mode_args *rm_args_ptr)
pptr->cd_pkt.type = boot_cat->initial_entry.media_type; /* Cheat */
pptr->cd_pkt.driveno = geometry->driveno;
pptr->cd_pkt.start = boot_cat->initial_entry.load_block;
- pptr->cd_pkt.load_seg = boot_cat->initial_entry.load_seg;
+ boot_seg = pptr->cd_pkt.load_seg = boot_cat->initial_entry.load_seg;
pptr->cd_pkt.sect_count = boot_cat->initial_entry.sect_count;
boot_len = pptr->cd_pkt.sect_count * 2048;
pptr->cd_pkt.geom1 = (uint8_t)(pptr->cylinders) & 0xFF;
- pptr->cd_pkt.geom2 = (uint8_t)(pptr->sectors) |
(uint8_t)((pptr->cylinders >> 2) & 0xC0);
+ pptr->cd_pkt.geom2 =
+ (uint8_t)(pptr->sectors) | (uint8_t)((pptr->cylinders >> 2)
& 0xC0);
pptr->cd_pkt.geom3 = (uint8_t)(pptr->heads);
}
@@ -1240,11 +1244,8 @@ void setup(const struct real_mode_args *rm_args_ptr)
/* Reboot into the new "disk" */
puts("Loading boot sector... ");
- if (do_eltorito) {
- /* 4 times as many 512-byte sectors in a 2048-byte sector */
- boot_lba = pptr->cd_pkt.start * 4;
- }
- memcpy((void *)boot_base, (char *)pptr->diskbuf + boot_lba * 512,
boot_len);
+ memcpy((void *)boot_base, (char *)pptr->diskbuf +
geometry->boot_lba * 512,
+ boot_len);
if (getcmditem("pause") != CMD_NOTFOUND) {
puts("press any key to boot... ");
--
1.5.6.3
- Shao Miller
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: 0001-memdisk-Use-boot_lba-logic-for-booting-an-offset-wi.patch
URL: <http://www.zytor.com/pipermail/syslinux/attachments/20091119/e10a9d18/attachment.ksh>
More information about the Syslinux
mailing list