|
|
f96e0b |
From 1a14b474415a15b4c75400eda67c9ef00895f0d1 Mon Sep 17 00:00:00 2001
|
|
|
f96e0b |
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
|
|
|
f96e0b |
Date: Sun, 14 Apr 2013 18:53:14 +0200
|
|
|
f96e0b |
Subject: [PATCH 308/482] Move GRUB out of system area when using
|
|
|
f96e0b |
xorriso 1.2.9 or later.
|
|
|
f96e0b |
|
|
|
f96e0b |
---
|
|
|
f96e0b |
ChangeLog | 4 +
|
|
|
f96e0b |
grub-core/Makefile.core.def | 13 +++
|
|
|
f96e0b |
grub-core/boot/i386/pc/boot.S | 194 +++++++++++++++++++++++++---------------
|
|
|
f96e0b |
grub-core/boot/i386/pc/cdboot.S | 5 +-
|
|
|
f96e0b |
util/grub-mkrescue.in | 23 +++--
|
|
|
f96e0b |
5 files changed, 159 insertions(+), 80 deletions(-)
|
|
|
f96e0b |
|
|
|
f96e0b |
diff --git a/ChangeLog b/ChangeLog
|
|
|
f96e0b |
index 60effd3..fc3dd51 100644
|
|
|
f96e0b |
--- a/ChangeLog
|
|
|
f96e0b |
+++ b/ChangeLog
|
|
|
f96e0b |
@@ -1,5 +1,9 @@
|
|
|
f96e0b |
2013-04-14 Vladimir Serbinenko <phcoder@gmail.com>
|
|
|
f96e0b |
|
|
|
f96e0b |
+ Move GRUB out of system area when using xorriso 1.2.9 or later.
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+2013-04-14 Vladimir Serbinenko <phcoder@gmail.com>
|
|
|
f96e0b |
+
|
|
|
f96e0b |
* tests/grub_cmd_date.in: Add missing exit 1.
|
|
|
f96e0b |
|
|
|
f96e0b |
2013-04-14 Vladimir Serbinenko <phcoder@gmail.com>
|
|
|
f96e0b |
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
|
|
|
f96e0b |
index f1f1012..459e566 100644
|
|
|
f96e0b |
--- a/grub-core/Makefile.core.def
|
|
|
f96e0b |
+++ b/grub-core/Makefile.core.def
|
|
|
f96e0b |
@@ -282,6 +282,19 @@ image = {
|
|
|
f96e0b |
};
|
|
|
f96e0b |
|
|
|
f96e0b |
image = {
|
|
|
f96e0b |
+ name = boot_hybrid;
|
|
|
f96e0b |
+ i386_pc = boot/i386/pc/boot.S;
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ cppflags = '-DHYBRID_BOOT=1';
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
|
|
f96e0b |
+ i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ objcopyflags = '-O binary';
|
|
|
f96e0b |
+ enable = i386_pc;
|
|
|
f96e0b |
+};
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+image = {
|
|
|
f96e0b |
name = cdboot;
|
|
|
f96e0b |
|
|
|
f96e0b |
i386_pc = boot/i386/pc/cdboot.S;
|
|
|
f96e0b |
diff --git a/grub-core/boot/i386/pc/boot.S b/grub-core/boot/i386/pc/boot.S
|
|
|
f96e0b |
index 314f140..c0880c6 100644
|
|
|
f96e0b |
--- a/grub-core/boot/i386/pc/boot.S
|
|
|
f96e0b |
+++ b/grub-core/boot/i386/pc/boot.S
|
|
|
f96e0b |
@@ -28,6 +28,81 @@
|
|
|
f96e0b |
#define MSG(x) movw $x, %si; call LOCAL(message)
|
|
|
f96e0b |
#define ERR(x) movw $x, %si; jmp LOCAL(error_message)
|
|
|
f96e0b |
|
|
|
f96e0b |
+ .macro floppy
|
|
|
f96e0b |
+part_start:
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+probe_values:
|
|
|
f96e0b |
+ .byte 36, 18, 15, 9, 0
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+LOCAL(floppy_probe):
|
|
|
f96e0b |
+/*
|
|
|
f96e0b |
+ * Perform floppy probe.
|
|
|
f96e0b |
+ */
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ movw $probe_values - 1, %si
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+LOCAL(probe_loop):
|
|
|
f96e0b |
+ /* reset floppy controller INT 13h AH=0 */
|
|
|
f96e0b |
+ xorw %ax, %ax
|
|
|
f96e0b |
+ int $0x13
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ incw %si
|
|
|
f96e0b |
+ movb (%si), %cl
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ /* if number of sectors is 0, display error and die */
|
|
|
f96e0b |
+ cmpb $0, %cl
|
|
|
f96e0b |
+ jne 1f
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+/*
|
|
|
f96e0b |
+ * Floppy disk probe failure.
|
|
|
f96e0b |
+ */
|
|
|
f96e0b |
+ MSG(fd_probe_error_string)
|
|
|
f96e0b |
+ jmp LOCAL(general_error)
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+/* "Floppy" */
|
|
|
f96e0b |
+fd_probe_error_string: .asciz "Floppy"
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+1:
|
|
|
f96e0b |
+ /* perform read */
|
|
|
f96e0b |
+ movw $GRUB_BOOT_MACHINE_BUFFER_SEG, %bx
|
|
|
f96e0b |
+ movw %bx, %es
|
|
|
f96e0b |
+ xorw %bx, %bx
|
|
|
f96e0b |
+ movw $0x201, %ax
|
|
|
f96e0b |
+ movb $0, %ch
|
|
|
f96e0b |
+ movb $0, %dh
|
|
|
f96e0b |
+ int $0x13
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ /* if error, jump to "LOCAL(probe_loop)" */
|
|
|
f96e0b |
+ jc LOCAL(probe_loop)
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ /* %cl is already the correct value! */
|
|
|
f96e0b |
+ movb $1, %dh
|
|
|
f96e0b |
+ movb $79, %ch
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ jmp LOCAL(final_init)
|
|
|
f96e0b |
+ .endm
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ .macro scratch
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ /* scratch space */
|
|
|
f96e0b |
+mode:
|
|
|
f96e0b |
+ .byte 0
|
|
|
f96e0b |
+disk_address_packet:
|
|
|
f96e0b |
+sectors:
|
|
|
f96e0b |
+ .long 0
|
|
|
f96e0b |
+heads:
|
|
|
f96e0b |
+ .long 0
|
|
|
f96e0b |
+cylinders:
|
|
|
f96e0b |
+ .word 0
|
|
|
f96e0b |
+sector_start:
|
|
|
f96e0b |
+ .byte 0
|
|
|
f96e0b |
+head_start:
|
|
|
f96e0b |
+ .byte 0
|
|
|
f96e0b |
+cylinder_start:
|
|
|
f96e0b |
+ .word 0
|
|
|
f96e0b |
+ /* more space... */
|
|
|
f96e0b |
+ .endm
|
|
|
f96e0b |
+
|
|
|
f96e0b |
.file "boot.S"
|
|
|
f96e0b |
|
|
|
f96e0b |
.text
|
|
|
f96e0b |
@@ -51,6 +126,34 @@ start:
|
|
|
f96e0b |
jmp LOCAL(after_BPB)
|
|
|
f96e0b |
nop /* do I care about this ??? */
|
|
|
f96e0b |
|
|
|
f96e0b |
+#ifdef HYBRID_BOOT
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ nop
|
|
|
f96e0b |
+ jmp LOCAL(after_BPB)
|
|
|
f96e0b |
+#else
|
|
|
f96e0b |
/*
|
|
|
f96e0b |
* This space is for the BIOS parameter block!!!! Don't change
|
|
|
f96e0b |
* the first jump, nor start the code anywhere but right after
|
|
|
f96e0b |
@@ -59,27 +162,14 @@ start:
|
|
|
f96e0b |
|
|
|
f96e0b |
. = _start + GRUB_BOOT_MACHINE_BPB_START
|
|
|
f96e0b |
. = _start + 4
|
|
|
f96e0b |
-
|
|
|
f96e0b |
- /* scratch space */
|
|
|
f96e0b |
-mode:
|
|
|
f96e0b |
- .byte 0
|
|
|
f96e0b |
-disk_address_packet:
|
|
|
f96e0b |
-sectors:
|
|
|
f96e0b |
- .long 0
|
|
|
f96e0b |
-heads:
|
|
|
f96e0b |
- .long 0
|
|
|
f96e0b |
-cylinders:
|
|
|
f96e0b |
- .word 0
|
|
|
f96e0b |
-sector_start:
|
|
|
f96e0b |
- .byte 0
|
|
|
f96e0b |
-head_start:
|
|
|
f96e0b |
- .byte 0
|
|
|
f96e0b |
-cylinder_start:
|
|
|
f96e0b |
- .word 0
|
|
|
f96e0b |
- /* more space... */
|
|
|
f96e0b |
+#endif
|
|
|
f96e0b |
+#ifdef HYBRID_BOOT
|
|
|
f96e0b |
+ floppy
|
|
|
f96e0b |
+#else
|
|
|
f96e0b |
+ scratch
|
|
|
f96e0b |
+#endif
|
|
|
f96e0b |
|
|
|
f96e0b |
. = _start + GRUB_BOOT_MACHINE_BPB_END
|
|
|
f96e0b |
-
|
|
|
f96e0b |
/*
|
|
|
f96e0b |
* End of BIOS parameter block.
|
|
|
f96e0b |
*/
|
|
|
f96e0b |
@@ -87,9 +177,11 @@ cylinder_start:
|
|
|
f96e0b |
kernel_address:
|
|
|
f96e0b |
.word GRUB_BOOT_MACHINE_KERNEL_ADDR
|
|
|
f96e0b |
|
|
|
f96e0b |
+#ifndef HYBRID_BOOT
|
|
|
f96e0b |
. = _start + GRUB_BOOT_MACHINE_KERNEL_SECTOR
|
|
|
f96e0b |
kernel_sector:
|
|
|
f96e0b |
.long 1, 0
|
|
|
f96e0b |
+#endif
|
|
|
f96e0b |
|
|
|
f96e0b |
. = _start + GRUB_BOOT_MACHINE_BOOT_DRIVE
|
|
|
f96e0b |
boot_drive:
|
|
|
f96e0b |
@@ -410,6 +502,11 @@ LOCAL(message):
|
|
|
f96e0b |
* number here.
|
|
|
f96e0b |
*/
|
|
|
f96e0b |
|
|
|
f96e0b |
+#ifdef HYBRID_BOOT
|
|
|
f96e0b |
+ . = _start + 0x1b0
|
|
|
f96e0b |
+kernel_sector:
|
|
|
f96e0b |
+ .long 1, 0
|
|
|
f96e0b |
+#endif
|
|
|
f96e0b |
. = _start + GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC
|
|
|
f96e0b |
nt_magic:
|
|
|
f96e0b |
.long 0
|
|
|
f96e0b |
@@ -419,62 +516,17 @@ nt_magic:
|
|
|
f96e0b |
* This is where an MBR would go if on a hard disk. The code
|
|
|
f96e0b |
* here isn't even referenced unless we're on a floppy. Kinda
|
|
|
f96e0b |
* sneaky, huh?
|
|
|
f96e0b |
- */
|
|
|
f96e0b |
+ */
|
|
|
f96e0b |
|
|
|
f96e0b |
. = _start + GRUB_BOOT_MACHINE_PART_START
|
|
|
f96e0b |
-part_start:
|
|
|
f96e0b |
-
|
|
|
f96e0b |
-probe_values:
|
|
|
f96e0b |
- .byte 36, 18, 15, 9, 0
|
|
|
f96e0b |
-
|
|
|
f96e0b |
-LOCAL(floppy_probe):
|
|
|
f96e0b |
-/*
|
|
|
f96e0b |
- * Perform floppy probe.
|
|
|
f96e0b |
- */
|
|
|
f96e0b |
-
|
|
|
f96e0b |
- movw $probe_values - 1, %si
|
|
|
f96e0b |
-
|
|
|
f96e0b |
-LOCAL(probe_loop):
|
|
|
f96e0b |
- /* reset floppy controller INT 13h AH=0 */
|
|
|
f96e0b |
- xorw %ax, %ax
|
|
|
f96e0b |
- int $0x13
|
|
|
f96e0b |
-
|
|
|
f96e0b |
- incw %si
|
|
|
f96e0b |
- movb (%si), %cl
|
|
|
f96e0b |
-
|
|
|
f96e0b |
- /* if number of sectors is 0, display error and die */
|
|
|
f96e0b |
- cmpb $0, %cl
|
|
|
f96e0b |
- jne 1f
|
|
|
f96e0b |
-
|
|
|
f96e0b |
-/*
|
|
|
f96e0b |
- * Floppy disk probe failure.
|
|
|
f96e0b |
- */
|
|
|
f96e0b |
- MSG(fd_probe_error_string)
|
|
|
f96e0b |
- jmp LOCAL(general_error)
|
|
|
f96e0b |
-
|
|
|
f96e0b |
-/* "Floppy" */
|
|
|
f96e0b |
-fd_probe_error_string: .asciz "Floppy"
|
|
|
f96e0b |
-
|
|
|
f96e0b |
-1:
|
|
|
f96e0b |
- /* perform read */
|
|
|
f96e0b |
- movw $GRUB_BOOT_MACHINE_BUFFER_SEG, %bx
|
|
|
f96e0b |
- movw %bx, %es
|
|
|
f96e0b |
- xorw %bx, %bx
|
|
|
f96e0b |
- movw $0x201, %ax
|
|
|
f96e0b |
- movb $0, %ch
|
|
|
f96e0b |
- movb $0, %dh
|
|
|
f96e0b |
- int $0x13
|
|
|
f96e0b |
|
|
|
f96e0b |
- /* if error, jump to "LOCAL(probe_loop)" */
|
|
|
f96e0b |
- jc LOCAL(probe_loop)
|
|
|
f96e0b |
-
|
|
|
f96e0b |
- /* %cl is already the correct value! */
|
|
|
f96e0b |
- movb $1, %dh
|
|
|
f96e0b |
- movb $79, %ch
|
|
|
f96e0b |
-
|
|
|
f96e0b |
- jmp LOCAL(final_init)
|
|
|
f96e0b |
+#ifndef HYBRID_BOOT
|
|
|
f96e0b |
+ floppy
|
|
|
f96e0b |
+#else
|
|
|
f96e0b |
+ scratch
|
|
|
f96e0b |
+#endif
|
|
|
f96e0b |
|
|
|
f96e0b |
. = _start + GRUB_BOOT_MACHINE_PART_END
|
|
|
f96e0b |
-
|
|
|
f96e0b |
+
|
|
|
f96e0b |
/* the last 2 bytes in the sector 0 contain the signature */
|
|
|
f96e0b |
.word GRUB_BOOT_MACHINE_SIGNATURE
|
|
|
f96e0b |
diff --git a/grub-core/boot/i386/pc/cdboot.S b/grub-core/boot/i386/pc/cdboot.S
|
|
|
f96e0b |
index d939835..92df7c7 100644
|
|
|
f96e0b |
--- a/grub-core/boot/i386/pc/cdboot.S
|
|
|
f96e0b |
+++ b/grub-core/boot/i386/pc/cdboot.S
|
|
|
f96e0b |
@@ -93,11 +93,12 @@ LOCAL(read_cdrom):
|
|
|
f96e0b |
pushw $CDBLK_LENG
|
|
|
f96e0b |
|
|
|
f96e0b |
/* Block number. */
|
|
|
f96e0b |
+ incl %esi
|
|
|
f96e0b |
pushl %eax
|
|
|
f96e0b |
pushl %esi
|
|
|
f96e0b |
|
|
|
f96e0b |
/* Buffer address. */
|
|
|
f96e0b |
- pushw $((DATA_ADDR - 0x400)>> 4)
|
|
|
f96e0b |
+ pushw $((DATA_ADDR - 0x200)>> 4)
|
|
|
f96e0b |
pushl %eax
|
|
|
f96e0b |
pushw $0x10
|
|
|
f96e0b |
|
|
|
f96e0b |
@@ -167,6 +168,6 @@ err_noboot_msg:
|
|
|
f96e0b |
err_cdfail_msg:
|
|
|
f96e0b |
.ascii "cdrom read fails\0"
|
|
|
f96e0b |
|
|
|
f96e0b |
- . = start + 0x1FF
|
|
|
f96e0b |
+ . = start + 0x7FF
|
|
|
f96e0b |
|
|
|
f96e0b |
.byte 0
|
|
|
f96e0b |
diff --git a/util/grub-mkrescue.in b/util/grub-mkrescue.in
|
|
|
f96e0b |
index c74c8ca..b97d674 100644
|
|
|
f96e0b |
--- a/util/grub-mkrescue.in
|
|
|
f96e0b |
+++ b/util/grub-mkrescue.in
|
|
|
f96e0b |
@@ -365,15 +365,25 @@ if test -e "${pc_dir}" ; then
|
|
|
f96e0b |
iso9660 biosdisk
|
|
|
f96e0b |
cat "${pc_dir}/cdboot.img" "${core_img}" > "${iso9660_dir}/boot/grub/i386-pc/eltorito.img"
|
|
|
f96e0b |
|
|
|
f96e0b |
- embed_img="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`" || exit 1
|
|
|
f96e0b |
- cat "${pc_dir}/boot.img" "${core_img}" > "${embed_img}"
|
|
|
f96e0b |
-
|
|
|
f96e0b |
- rm -f "${core_img}"
|
|
|
f96e0b |
-
|
|
|
f96e0b |
grub_mkisofs_arguments="${grub_mkisofs_arguments} -b boot/grub/i386-pc/eltorito.img -no-emul-boot -boot-load-size 4 -boot-info-table"
|
|
|
f96e0b |
if [ "$system_area" = common ]; then
|
|
|
f96e0b |
- grub_mkisofs_arguments="--embedded-boot ${embed_img}"
|
|
|
f96e0b |
+ if "${xorriso}" -as mkisofs -help 2>&1 | fgrep "grub2-boot-info" >/dev/null; then
|
|
|
f96e0b |
+ grub_mkisofs_arguments="${grub_mkisofs_arguments} --grub2-boot-info --grub2-mbr ${pc_dir}/boot_hybrid.img"
|
|
|
f96e0b |
+ else
|
|
|
f96e0b |
+ gettext "Your xorriso doesn't support \`--grub2-boot-info'. Some features are disabled. Please use xorriso 1.2.9 or later."
|
|
|
f96e0b |
+ echo
|
|
|
f96e0b |
+ sysarea_img="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`" || exit 1
|
|
|
f96e0b |
+ cat "${pc_dir}/boot.img" "${core_img}" > "${sysarea_img}"
|
|
|
f96e0b |
+ if [ "$(wc -c "${sysarea_img}" | awk '{ print $1; }')" -gt 32768 ]; then
|
|
|
f96e0b |
+ gettext "Your xorriso doesn't support \`--grub2-boot-info'. Your core image is too big. Boot as disk is disabled. Please use xorriso 1.2.9 or later."
|
|
|
f96e0b |
+ echo
|
|
|
f96e0b |
+ else
|
|
|
f96e0b |
+ grub_mkisofs_arguments="${grub_mkisofs_arguments} -G ${sysarea_img}"
|
|
|
f96e0b |
+ fi
|
|
|
f96e0b |
+ fi
|
|
|
f96e0b |
fi
|
|
|
f96e0b |
+
|
|
|
f96e0b |
+ rm -f "${core_img}"
|
|
|
f96e0b |
fi
|
|
|
f96e0b |
|
|
|
f96e0b |
# build multiboot core.img
|
|
|
f96e0b |
@@ -495,6 +505,5 @@ fi
|
|
|
f96e0b |
rm -rf "${iso9660_dir}"
|
|
|
f96e0b |
|
|
|
f96e0b |
rm -f "${sysarea_img}"
|
|
|
f96e0b |
-rm -f "${embed_img}"
|
|
|
f96e0b |
|
|
|
f96e0b |
exit 0
|
|
|
f96e0b |
--
|
|
|
f96e0b |
1.8.2.1
|
|
|
f96e0b |
|