From 4671aabad620459d9378871b8537f7c8d53e4a18 Mon Sep 17 00:00:00 2001 From: imp Date: Tue, 30 Nov 2004 09:40:11 +0000 Subject: Add observations of the Linux98 and Grub/98 boot loaders. These observations lead me to believe that the convetion for pc98 boot loaders is to have a jump unstruction, followed by a string, followed by code. The jump usually doesn't have a nop after it and usually the string is NUL terminated, but Grub/98 breaks both of these rules. # I looked for, but failed to find the Minux boot blocks for PC-9801 port. --- sys/geom/geom_pc98.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/sys/geom/geom_pc98.c b/sys/geom/geom_pc98.c index 0b24690..f30cb9d 100644 --- a/sys/geom/geom_pc98.c +++ b/sys/geom/geom_pc98.c @@ -84,11 +84,21 @@ g_pc98_modify(struct g_geom *gp, struct g_pc98_softc *ms, u_char *sec) #if 0 /* - * FreeBSD's boot0 IPL uses the name IPL1. This test initially was - * based on that observation. However, other boot loaders have use - * different names. A likely good test would be to test if the first - * 4 bytes are a jump to location 11 (or greater?) as well as the next - * 7 bytes being printable or with trailing NUL's. + * By convetion, it seems that the ipl program has a jump at location + * 0 to the real start of the boot loader. By convetion, it appears + * that after this jump, there's a string, terminated by at last one, + * if not more, zeros, followed by the target of the jump. FreeBSD's + * pc98 boot0 uses 'IPL1' followed by 3 zeros here, likely for + * compatibility with some older boot loader. Linux98's boot loader + * appears to use 'Linux 98' followed by only two. GRUB/98 appears to + * use 'GRUB/98 ' followed by none. These last two appear to be + * ported from the ia32 versions, but appear to show similar + * convention. Grub/98 has an additional NOP after the jmp, which + * isn't present in others. + * + * The following test was inspired by looking only at partitions + * with FreeBSD's boot0 (or one that it is compatible with). As + * such, if failed when other IPL programs were used. */ if (sec[4] != 'I' || sec[5] != 'P' || sec[6] != 'L' || sec[7] != '1') return (EBUSY); -- cgit v1.1