Index: grub/stage2/builtins.c =================================================================== --- grub.orig/stage2/builtins.c 2008-06-16 15:18:14.649009000 +0100 +++ grub/stage2/builtins.c 2008-06-16 15:18:14.719009000 +0100 @@ -45,8 +45,10 @@ #ifdef GRUB_UTIL # include #else /* ! GRUB_UTIL */ +#ifndef __MINIOS # include # include +#endif #endif /* ! GRUB_UTIL */ #ifdef USE_MD5_PASSWORDS @@ -246,11 +248,13 @@ boot_func (char *arg, int flags) { struct term_entry *prev_term = current_term; +#ifndef __MINIOS__ /* Clear the int15 handler if we can boot the kernel successfully. This assumes that the boot code never fails only if KERNEL_TYPE is not KERNEL_TYPE_NONE. Is this assumption is bad? */ if (kernel_type != KERNEL_TYPE_NONE) unset_int15_handler (); +#endif /* if our terminal needed initialization, we should shut it down * before booting the kernel, but we want to save what it was so @@ -261,13 +265,21 @@ current_term = term_table; /* assumption: console is first */ } +#ifndef __MINIOS__ #ifdef SUPPORT_NETBOOT /* Shut down the networking. */ cleanup_net (); #endif +#endif switch (kernel_type) { +#ifdef __MINIOS__ + case KERNEL_TYPE_PV: + /* Paravirtualized */ + pv_boot(); + break; +#else case KERNEL_TYPE_FREEBSD: case KERNEL_TYPE_NETBSD: /* *BSD */ @@ -319,6 +331,7 @@ multi_boot ((int) entry_addr, (int) &mbi); break; +#endif default: errnum = ERR_BOOT_COMMAND; return 1; @@ -1123,6 +1136,7 @@ }; +#ifndef __MINIOS__ /* displayapm */ static int displayapm_func (char *arg, int flags) @@ -1163,8 +1177,10 @@ "displayapm", "Display APM BIOS information." }; +#endif +#ifndef __MINIOS__ /* displaymem */ static int displaymem_func (char *arg, int flags) @@ -1218,6 +1234,7 @@ "Display what GRUB thinks the system address space map of the" " machine is, including all regions of physical RAM installed." }; +#endif /* dump FROM TO */ @@ -1280,6 +1297,7 @@ #endif /* GRUB_UTIL */ +#ifndef __MINIOS__ static char embed_info[32]; /* embed */ /* Embed a Stage 1.5 in the first cylinder after MBR or in the @@ -1413,6 +1431,7 @@ " is a drive, or in the \"bootloader\" area if DEVICE is a FFS partition." " Print the number of sectors which STAGE1_5 occupies if successful." }; +#endif /* fallback */ @@ -1956,6 +1975,7 @@ #endif /* SUPPORT_NETBOOT */ +#ifndef __MINIOS__ /* impsprobe */ static int impsprobe_func (char *arg, int flags) @@ -1982,6 +2002,7 @@ " configuration table and boot the various CPUs which are found into" " a tight loop." }; +#endif /* initrd */ @@ -1992,6 +2013,7 @@ { case KERNEL_TYPE_LINUX: case KERNEL_TYPE_BIG_LINUX: + case KERNEL_TYPE_PV: if (! load_initrd (arg)) return 1; break; @@ -2015,6 +2037,7 @@ }; +#ifndef __MINIOS__ /* install */ static int install_func (char *arg, int flags) @@ -2555,8 +2578,10 @@ " for LBA mode. If the option `--stage2' is specified, rewrite the Stage" " 2 via your OS's filesystem instead of the raw device." }; +#endif +#ifndef __MINIOS__ /* ioprobe */ static int ioprobe_func (char *arg, int flags) @@ -2598,6 +2623,7 @@ "ioprobe DRIVE", "Probe I/O ports used for the drive DRIVE." }; +#endif /* print */ static int @@ -2910,6 +2910,7 @@ switch (kernel_type) { case KERNEL_TYPE_MULTIBOOT: + case KERNEL_TYPE_PV: if (mb_cmdline + len + 1 > (char *) MB_CMDLINE_BUF + MB_CMDLINE_BUFLEN) { errnum = ERR_WONT_FIT; @@ -3776,6 +3802,7 @@ }; +#ifndef __MINIOS__ #ifdef SUPPORT_SERIAL /* serial */ static int @@ -3927,8 +3954,10 @@ " default values are COM1, 9600, 8N1." }; #endif /* SUPPORT_SERIAL */ +#endif +#ifndef __MINIOS__ /* setkey */ struct keysym { @@ -4174,8 +4203,10 @@ " is a digit), and delete. If no argument is specified, reset key" " mappings." }; +#endif +#ifndef __MINIOS__ /* setup */ static int setup_func (char *arg, int flags) @@ -4484,6 +4515,7 @@ " partition where GRUB images reside, specify the option `--stage2'" " to tell GRUB the file name under your OS." }; +#endif #if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS) @@ -4788,6 +4820,7 @@ #endif /* SUPPORT_SERIAL */ +#ifndef __MINIOS__ /* testload */ static int testload_func (char *arg, int flags) @@ -4874,8 +4907,10 @@ " consistent offset error. If this test succeeds, then a good next" " step is to try loading a kernel." }; +#endif +#ifndef __MINIOS__ /* testvbe MODE */ static int testvbe_func (char *arg, int flags) @@ -4979,6 +5014,7 @@ "testvbe MODE", "Test the VBE mode MODE. Hit any key to return." }; +#endif #ifdef SUPPORT_NETBOOT @@ -5075,6 +5111,7 @@ }; +#ifndef __MINIOS__ /* uppermem */ static int uppermem_func (char *arg, int flags) @@ -5095,8 +5132,10 @@ "Force GRUB to assume that only KBYTES kilobytes of upper memory are" " installed. Any system address range maps are discarded." }; +#endif +#ifndef __MINIOS__ /* vbeprobe */ static int vbeprobe_func (char *arg, int flags) @@ -5203,6 +5242,7 @@ "Probe VBE information. If the mode number MODE is specified, show only" " the information about only the mode." }; +#endif /* The table of builtin commands. Sorted in dictionary order. */ @@ -5233,12 +5273,16 @@ #ifdef SUPPORT_NETBOOT &builtin_dhcp, #endif /* SUPPORT_NETBOOT */ +#ifndef __MINIOS__ &builtin_displayapm, &builtin_displaymem, +#endif #ifdef GRUB_UTIL &builtin_dump, #endif /* GRUB_UTIL */ +#ifndef __MINIOS__ &builtin_embed, +#endif &builtin_fallback, &builtin_find, #ifdef SUPPORT_GRAPHICS @@ -5253,10 +5297,14 @@ #ifdef SUPPORT_NETBOOT &builtin_ifconfig, #endif /* SUPPORT_NETBOOT */ +#ifndef __MINIOS__ &builtin_impsprobe, +#endif &builtin_initrd, +#ifndef __MINIOS__ &builtin_install, &builtin_ioprobe, +#endif &builtin_kernel, &builtin_lock, &builtin_makeactive, @@ -5283,11 +5331,13 @@ &builtin_root, &builtin_rootnoverify, &builtin_savedefault, +#ifndef __MINIOS__ #ifdef SUPPORT_SERIAL &builtin_serial, #endif /* SUPPORT_SERIAL */ &builtin_setkey, &builtin_setup, +#endif #ifdef SUPPORT_GRAPHICS &builtin_shade, &builtin_splashimage, @@ -5298,16 +5348,20 @@ #ifdef SUPPORT_SERIAL &builtin_terminfo, #endif /* SUPPORT_SERIAL */ +#ifndef __MINIOS__ &builtin_testload, &builtin_testvbe, +#endif #ifdef SUPPORT_NETBOOT &builtin_tftpserver, #endif /* SUPPORT_NETBOOT */ &builtin_timeout, &builtin_title, &builtin_unhide, +#ifndef __MINIOS__ &builtin_uppermem, &builtin_vbeprobe, +#endif #ifdef SUPPORT_GRAPHICS &builtin_viewport, #endif Index: grub/stage2/char_io.c =================================================================== --- grub.orig/stage2/char_io.c 2008-06-16 15:18:14.516009000 +0100 +++ grub/stage2/char_io.c 2008-06-16 15:18:14.726009000 +0100 @@ -20,6 +20,7 @@ #include #include +#include #ifdef SUPPORT_HERCULES # include @@ -36,6 +37,7 @@ #ifndef STAGE1_5 struct term_entry term_table[] = { +#ifdef SUPPORT_CONSOLE { "console", 0, @@ -52,6 +54,7 @@ 0, 0 }, +#endif #ifdef SUPPORT_SERIAL { "serial", @@ -131,9 +134,9 @@ } char * -convert_to_ascii (char *buf, int c,...) +convert_to_ascii (char *buf, int c, int _num) { - unsigned long num = *((&c) + 1), mult = 10; + unsigned long num = _num, mult = 10; char *ptr = buf; #ifndef STAGE1_5 @@ -182,11 +185,11 @@ void grub_printf (const char *format,...) { - int *dataptr = (int *) &format; + va_list ap; char c, str[16]; - - dataptr++; + va_start(ap, format); + while ((c = *(format++)) != 0) { if (c != '%') @@ -200,21 +203,32 @@ case 'X': #endif case 'u': - *convert_to_ascii (str, c, *((unsigned long *) dataptr++)) = 0; + { + unsigned i = va_arg(ap, unsigned); + *convert_to_ascii (str, c, i) = 0; grub_putstr (str); break; + } #ifndef STAGE1_5 case 'c': - grub_putchar ((*(dataptr++)) & 0xff); + { + int c = va_arg(ap, int); + grub_putchar (c & 0xff); break; + } case 's': - grub_putstr ((char *) *(dataptr++)); + { + char *s = va_arg(ap, char*); + grub_putstr (s); break; + } #endif } } + + va_end(ap); } #ifndef STAGE1_5 @@ -223,11 +237,11 @@ { /* XXX hohmuth ugly hack -- should unify with printf() */ - int *dataptr = (int *) &format; + va_list ap; char c, *ptr, str[16]; char *bp = buffer; - dataptr++; + va_start(ap, format); while ((c = *format++) != 0) { @@ -237,20 +251,27 @@ switch (c = *(format++)) { case 'd': case 'u': case 'x': - *convert_to_ascii (str, c, *((unsigned long *) dataptr++)) = 0; + { + unsigned i = va_arg(ap, unsigned); + *convert_to_ascii (str, c, i) = 0; ptr = str; while (*ptr) *bp++ = *(ptr++); /* putchar(*(ptr++)); */ break; + } - case 'c': *bp++ = (*(dataptr++))&0xff; + case 'c': + { + int c = va_arg(ap, int); + *bp++ = c&0xff; /* putchar((*(dataptr++))&0xff); */ break; + } case 's': - ptr = (char *) (*(dataptr++)); + ptr = va_arg(ap, char *); while ((c = *ptr++) != 0) *bp++ = c; /* putchar(c); */ @@ -258,6 +279,8 @@ } } + va_end(ap); + *bp = 0; return bp - buffer; } @@ -1263,12 +1286,14 @@ return ! errnum; #endif /* GRUB_UTIL */ +#ifndef __MINIOS__ if ((addr < RAW_ADDR (0x1000)) || (addr < RAW_ADDR (0x100000) && RAW_ADDR (mbi.mem_lower * 1024) < (addr + len)) || (addr >= RAW_ADDR (0x100000) && RAW_ADDR (mbi.mem_upper * 1024) < ((addr - 0x100000) + len))) errnum = ERR_WONT_FIT; +#endif return ! errnum; } @@ -1342,7 +1367,7 @@ } #endif /* ! STAGE1_5 */ -#ifndef GRUB_UTIL +#if !defined(GRUB_UTIL) && !defined(__MINIOS__) # undef memcpy /* GCC emits references to memcpy() for struct copies etc. */ void *memcpy (void *dest, const void *src, int n) __attribute__ ((alias ("grub_memmove"))); Index: grub/stage2/disk_io.c =================================================================== --- grub.orig/stage2/disk_io.c 2008-06-16 15:18:03.327932000 +0100 +++ grub/stage2/disk_io.c 2008-06-16 15:18:14.733009000 +0100 @@ -130,7 +130,14 @@ static inline unsigned long log2 (unsigned long word) { - asm volatile ("bsfl %1,%0" + asm volatile ("bsf" +#ifdef __i386__ + "l" +#endif +#ifdef __x86_64__ + "q" +#endif + " %1,%0" : "=r" (word) : "r" (word)); return word; Index: grub/stage2/fsys_fat.c =================================================================== --- grub.orig/stage2/fsys_fat.c 2008-06-16 15:18:03.337934000 +0100 +++ grub/stage2/fsys_fat.c 2008-06-16 15:18:14.737009000 +0100 @@ -57,7 +57,14 @@ static __inline__ unsigned long log2 (unsigned long word) { - __asm__ ("bsfl %1,%0" + __asm__ ("bsf" +#ifdef __i386__ + "l" +#endif +#ifdef __x86_64__ + "q" +#endif + " %1,%0" : "=r" (word) : "r" (word)); return word; Index: grub/stage2/pc_slice.h =================================================================== --- grub.orig/stage2/pc_slice.h 2008-06-16 15:18:03.347932000 +0100 +++ grub/stage2/pc_slice.h 2008-06-16 15:18:14.746009000 +0100 @@ -38,50 +38,50 @@ */ #define PC_MBR_CHECK_SIG(mbr_ptr) \ - ( *( (unsigned short *) (((int) mbr_ptr) + PC_MBR_SIG_OFFSET) ) \ + ( *( (unsigned short *) (((long) mbr_ptr) + PC_MBR_SIG_OFFSET) ) \ == PC_MBR_SIGNATURE ) #define PC_MBR_SIG(mbr_ptr) \ - ( *( (unsigned short *) (((int) mbr_ptr) + PC_MBR_SIG_OFFSET) ) ) + ( *( (unsigned short *) (((long) mbr_ptr) + PC_MBR_SIG_OFFSET) ) ) #define PC_SLICE_FLAG(mbr_ptr, part) \ - ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET \ + ( *( (unsigned char *) (((long) mbr_ptr) + PC_SLICE_OFFSET \ + (part << 4)) ) ) #define PC_SLICE_HEAD(mbr_ptr, part) \ - ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 1 \ + ( *( (unsigned char *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 1 \ + (part << 4)) ) ) #define PC_SLICE_SEC(mbr_ptr, part) \ - ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 2 \ + ( *( (unsigned char *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 2 \ + (part << 4)) ) ) #define PC_SLICE_CYL(mbr_ptr, part) \ - ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 3 \ + ( *( (unsigned char *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 3 \ + (part << 4)) ) ) #define PC_SLICE_TYPE(mbr_ptr, part) \ - ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 4 \ + ( *( (unsigned char *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 4 \ + (part << 4)) ) ) #define PC_SLICE_EHEAD(mbr_ptr, part) \ - ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 5 \ + ( *( (unsigned char *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 5 \ + (part << 4)) ) ) #define PC_SLICE_ESEC(mbr_ptr, part) \ - ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 6 \ + ( *( (unsigned char *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 6 \ + (part << 4)) ) ) #define PC_SLICE_ECYL(mbr_ptr, part) \ - ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 7 \ + ( *( (unsigned char *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 7 \ + (part << 4)) ) ) #define PC_SLICE_START(mbr_ptr, part) \ - ( *( (unsigned long *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 8 \ + ( *( (unsigned long *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 8 \ + (part << 4)) ) ) #define PC_SLICE_LENGTH(mbr_ptr, part) \ - ( *( (unsigned long *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 12 \ + ( *( (unsigned long *) (((long) mbr_ptr) + PC_SLICE_OFFSET + 12 \ + (part << 4)) ) ) Index: grub/stage2/shared.h =================================================================== --- grub.orig/stage2/shared.h 2008-06-16 15:18:14.537009000 +0100 +++ grub/stage2/shared.h 2008-06-17 14:25:08.443906000 +0100 @@ -39,6 +39,10 @@ extern char *grub_scratch_mem; # define RAW_ADDR(x) ((x) + (int) grub_scratch_mem) # define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4) +#elif defined(__MINIOS__) +extern char grub_scratch_mem[]; +# define RAW_ADDR(x) ((x) + (int) grub_scratch_mem) +# define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4) #else # define RAW_ADDR(x) (x) # define RAW_SEG(x) (x) @@ -707,7 +711,9 @@ /* Halt the system, using APM if possible. If NO_APM is true, don't use APM even if it is available. */ +#ifndef __MINIOS__ void grub_halt (int no_apm) __attribute__ ((noreturn)); +#endif /* Copy MAP to the drive map and set up int13_handler. */ void set_int13_handler (unsigned short *map); @@ -857,7 +863,8 @@ KERNEL_TYPE_BIG_LINUX, /* Big Linux. */ KERNEL_TYPE_FREEBSD, /* FreeBSD. */ KERNEL_TYPE_NETBSD, /* NetBSD. */ - KERNEL_TYPE_CHAINLOADER /* Chainloader. */ + KERNEL_TYPE_CHAINLOADER, /* Chainloader. */ + KERNEL_TYPE_PV /* Paravirtualized. */ } kernel_t; @@ -890,7 +897,7 @@ int grub_strlen (const char *str); char *grub_strcpy (char *dest, const char *src); -#ifndef GRUB_UTIL +#if !defined(GRUB_UTIL) && !defined(__MINIOS__) typedef unsigned long grub_jmp_buf[6]; #else /* In the grub shell, use the libc jmp_buf instead. */ @@ -898,7 +905,7 @@ # define grub_jmp_buf jmp_buf #endif -#ifdef GRUB_UTIL +#if defined(GRUB_UTIL) || defined(__MINIOS__) # define grub_setjmp setjmp # define grub_longjmp longjmp #else /* ! GRUB_UTIL */ @@ -914,7 +921,7 @@ /* misc */ void init_page (void); void print_error (void); -char *convert_to_ascii (char *buf, int c, ...); +char *convert_to_ascii (char *buf, int c, int num); int get_cmdline (char *prompt, char *cmdline, int maxlen, int echo_char, int history); int substring (const char *s1, const char *s2); Index: grub/netboot/etherboot.h =================================================================== --- grub.orig/netboot/etherboot.h 2008-06-16 15:18:03.446934000 +0100 +++ grub/netboot/etherboot.h 2008-06-16 15:18:14.760009000 +0100 @@ -246,7 +246,7 @@ typedef struct { - unsigned long s_addr; + unsigned int s_addr; } in_addr; @@ -302,7 +302,7 @@ char bp_htype; char bp_hlen; char bp_hops; - unsigned long bp_xid; + unsigned int bp_xid; unsigned short bp_secs; unsigned short unused; in_addr bp_ciaddr; @@ -411,25 +411,25 @@ struct { - long id; - long type; - long rpcvers; - long prog; - long vers; - long proc; - long data[1]; + int id; + int type; + int rpcvers; + int prog; + int vers; + int proc; + int data[1]; } call; struct { - long id; - long type; - long rstatus; - long verifier; - long v2; - long astatus; - long data[1]; + int id; + int type; + int rstatus; + int verifier; + int v2; + int astatus; + int data[1]; } reply; } @@ -517,7 +517,9 @@ /* misc.c */ extern void twiddle (void); +#ifndef __MINIOS__ extern void sleep (int secs); +#endif extern int getdec (char **s); extern void etherboot_printf (const char *, ...); extern int etherboot_sprintf (char *, const char *, ...); Index: grub/stage2/common.c =================================================================== --- grub.orig/stage2/common.c 2008-06-16 15:18:03.366934000 +0100 +++ grub/stage2/common.c 2008-06-16 15:18:14.764009000 +0100 @@ -137,6 +137,7 @@ } #endif /* ! STAGE1_5 */ +#ifndef __MINIOS__ /* This queries for BIOS information. */ void init_bios_info (void) @@ -335,3 +336,4 @@ /* Start main routine here. */ cmain (); } +#endif Index: grub/stage2/serial.c =================================================================== --- grub.orig/stage2/serial.c 2008-06-16 15:18:03.376934000 +0100 +++ grub/stage2/serial.c 2008-06-16 15:18:14.769009000 +0100 @@ -37,7 +37,7 @@ /* Hardware-dependent definitions. */ -#ifndef GRUB_UTIL +#if !defined(GRUB_UTIL) && !defined(__MINIOS__) /* The structure for speed vs. divisor. */ struct divisor { @@ -222,6 +222,8 @@ {('3' | ('~' << 8)), 4}, {('5' | ('~' << 8)), 7}, {('6' | ('~' << 8)), 3}, + {('7' | ('~' << 8)), 1}, + {('8' | ('~' << 8)), 5}, }; /* The buffer must start with ``ESC [''. */ Index: grub/stage2/tparm.c =================================================================== --- grub.orig/stage2/tparm.c 2008-06-16 15:18:03.390933000 +0100 +++ grub/stage2/tparm.c 2008-06-16 15:18:14.774010000 +0100 @@ -48,6 +48,7 @@ #include "shared.h" #include "tparm.h" +#include /* * Common/troublesome character definitions @@ -320,7 +321,7 @@ #define isLOWER(c) ((c) >= 'a' && (c) <= 'z') static inline char * -tparam_internal(const char *string, int *dataptr) +tparam_internal(const char *string, va_list ap) { #define NUM_VARS 26 char *p_is_s[9]; @@ -461,9 +462,9 @@ * a char* and an int may not be the same size on the stack. */ if (p_is_s[i] != 0) { - p_is_s[i] = (char *)(*(dataptr++)); + p_is_s[i] = va_arg(ap, char *); } else { - param[i] = (int)(*(dataptr++)); + param[i] = va_arg(ap, int); } } @@ -716,11 +717,13 @@ grub_tparm(const char *string,...) { char *result; - int *dataptr = (int *) &string; + va_list ap; - dataptr++; + va_start(ap, string); - result = tparam_internal(string, dataptr); + result = tparam_internal(string, ap); + + va_end(ap); return result; } Index: grub/stage2/fsys_iso9660.c =================================================================== --- grub.orig/stage2/fsys_iso9660.c 2008-06-16 15:18:03.400933000 +0100 +++ grub/stage2/fsys_iso9660.c 2008-06-16 15:18:14.779009000 +0100 @@ -59,7 +59,14 @@ static inline unsigned long log2 (unsigned long word) { - asm volatile ("bsfl %1,%0" + asm volatile ("bsf" +#ifdef __i386__ + "l" +#endif +#ifdef __x86_64__ + "q" +#endif + " %1,%0" : "=r" (word) : "r" (word)); return word; Index: grub/stage2/fsys_reiserfs.c =================================================================== --- grub.orig/stage2/fsys_reiserfs.c 2008-06-16 15:18:03.410933000 +0100 +++ grub/stage2/fsys_reiserfs.c 2008-06-20 18:33:52.002100000 +0100 @@ -224,8 +224,8 @@ struct disk_child { - unsigned long dc_block_number; /* Disk child's block number. */ - unsigned short dc_size; /* Disk child's used space. */ + __u32 dc_block_number; /* Disk child's block number. */ + __u16 dc_size; /* Disk child's used space. */ }; #define DC_SIZE (sizeof (struct disk_child)) @@ -369,7 +369,14 @@ static __inline__ unsigned long log2 (unsigned long word) { - __asm__ ("bsfl %1,%0" + __asm__ ("bsf" +#ifdef __i386__ + "l" +#endif +#ifdef __x86_64__ + "q" +#endif + " %1,%0" : "=r" (word) : "r" (word)); return word; Index: grub/netboot/misc.c =================================================================== --- grub.orig/netboot/misc.c 2008-06-16 15:18:03.456934000 +0100 +++ grub/netboot/misc.c 2008-06-16 15:18:14.790009000 +0100 @@ -21,7 +21,9 @@ #define GRUB 1 #include +#include +#ifndef __MINIOS__ void sleep (int secs) { @@ -30,6 +32,7 @@ while (currticks () < tmo) ; } +#endif void twiddle (void) @@ -71,7 +74,7 @@ Note: width specification not supported **************************************************************************/ static int -etherboot_vsprintf (char *buf, const char *fmt, const int *dp) +etherboot_vsprintf (char *buf, const char *fmt, va_list ap) { char *p, *s; @@ -86,7 +89,7 @@ if (*++fmt == 's') { - for (p = (char *) *dp++; *p != '\0'; p++) + for (p = va_arg(ap, char *); *p != '\0'; p++) buf ? *s++ = *p : grub_putchar (*p); } else @@ -121,11 +124,9 @@ if ((*fmt | 0x20) == 'x') { /* With x86 gcc, sizeof(long) == sizeof(int) */ - const long *lp = (const long *) dp; - long h = *lp++; + long h = va_arg(ap, int); int ncase = (*fmt & 0x20); - dp = (const int *) lp; if (alt) { *q++ = '0'; @@ -136,7 +137,7 @@ } else if (*fmt == 'd') { - int i = *dp++; + int i = va_arg(ap, int); char *r; if (i < 0) @@ -171,10 +172,8 @@ unsigned char c[4]; } u; - const long *lp = (const long *) dp; - u.l = *lp++; - dp = (const int *) lp; + u.l = va_arg(ap, int); for (r = &u.c[0]; r < &u.c[4]; ++r) q += etherboot_sprintf (q, "%d.", *r); @@ -184,7 +183,7 @@ else if (*fmt == '!') { char *r; - p = (char *) *dp++; + p = va_arg(ap, char *); for (r = p + ETH_ALEN; p < r; ++p) q += etherboot_sprintf (q, "%hhX:", *p); @@ -192,7 +191,7 @@ --q; } else if (*fmt == 'c') - *q++ = *dp++; + *q++ = va_arg(ap, int); else *q++ = *fmt; @@ -211,13 +210,21 @@ int etherboot_sprintf (char *buf, const char *fmt, ...) { - return etherboot_vsprintf (buf, fmt, ((const int *) &fmt) + 1); + va_list ap; + int ret; + va_start(ap, fmt); + ret = etherboot_vsprintf (buf, fmt, ap); + va_end(ap); + return ret; } void etherboot_printf (const char *fmt, ...) { - (void) etherboot_vsprintf (0, fmt, ((const int *) &fmt) + 1); + va_list ap; + va_start(ap, fmt); + etherboot_vsprintf (0, fmt, ap); + va_end(ap); } int Index: grub/netboot/main.c =================================================================== --- grub.orig/netboot/main.c 2008-06-16 15:18:03.470932000 +0100 +++ grub/netboot/main.c 2008-06-16 15:18:14.797009000 +0100 @@ -55,7 +55,7 @@ static int vendorext_isvalid; static unsigned long netmask; static struct bootpd_t bootp_data; -static unsigned long xid; +static unsigned int xid; #define BOOTP_DATA_ADDR (&bootp_data) @@ -778,7 +778,7 @@ arpreply = (struct arprequest *) &nic.packet[ETH_HLEN]; - if (arpreply->opcode == htons (ARP_REPLY) + if (arpreply->opcode == htons (ARP_REPLY) && ptr && ! grub_memcmp (arpreply->sipaddr, ptr, sizeof (in_addr)) && type == AWAIT_ARP) { @@ -827,7 +827,7 @@ { arpreply = (struct arprequest *) &nic.packet[ETH_HLEN]; - if (arpreply->opcode == htons (RARP_REPLY) + if (arpreply->opcode == htons (RARP_REPLY) && ptr && ! grub_memcmp (arpreply->thwaddr, ptr, ETH_ALEN)) { grub_memmove ((char *) arptable[ARP_SERVER].node, @@ -1135,7 +1135,7 @@ long rfc2131_sleep_interval (int base, int exp) { - static long seed = 0; + static unsigned seed = 0; long q; unsigned long tmo; Index: grub/stage2/graphics.c =================================================================== --- grub.orig/stage2/graphics.c 2008-06-16 15:18:14.524009000 +0100 +++ grub/stage2/graphics.c 2008-06-17 14:29:05.204328000 +0100 @@ -30,7 +30,29 @@ #include #include +#ifdef __MINIOS__ +#include +typedef uint8_t Bit8u; +#include +#include +#include +#define set_int1c_handler() (void)0 +#define unset_int1c_handler() (void)0 +static uint32_t *VIDEOMEM; +static struct fbfront_dev *fb_dev; +static uint32_t palette[17]; +short cursorX, cursorY; +/* TODO: blink */ +uint32_t cursorBuf32[16*8]; +#define WIDTH 640 +#define HEIGHT 480 +#define DEPTH 32 +#define RAMSIZE (WIDTH * HEIGHT * (DEPTH / 8)) +#else +#define fbfront_update(dev, x, y, w, h) (void)0 int saved_videomode; +#endif + unsigned char *font8x16; int graphics_inited = 0; @@ -38,11 +60,15 @@ int shade = 1, no_cursor = 0; +#ifdef __MINIOS__ +uint32_t VSHADOW[RAMSIZE]; +#else #define VSHADOW VSHADOW1 unsigned char VSHADOW1[38400]; unsigned char VSHADOW2[38400]; unsigned char VSHADOW4[38400]; unsigned char VSHADOW8[38400]; +#endif /* define the default viewable area */ int view_x0 = 0; @@ -129,6 +155,8 @@ count_lines = k; no_scroll = 0; + + fbfront_update(fb_dev, view_x0 * 8, view_y0 * 16, (view_x1 - view_x0) * 8, (view_y1 - view_y0) * 16); } /* Set the splash image */ @@ -154,17 +182,29 @@ int graphics_init() { if (!graphics_inited) { +#ifdef __MINIOS__ + VIDEOMEM = memalign(PAGE_SIZE, RAMSIZE); + if (!(fb_dev = fb_open(VIDEOMEM, WIDTH, HEIGHT, DEPTH))) { + free(VIDEOMEM); + return 0; + } +#else saved_videomode = set_videomode(0x12); if (get_videomode() != 0x12) { set_videomode(saved_videomode); return 0; } +#endif graphics_inited = 1; } else return 1; +#ifdef __MINIOS__ + font8x16 = vgafont16; +#else font8x16 = (unsigned char*)graphics_get_font(); +#endif /* make sure that the highlight color is set correctly */ graphics_highlight_color = ((graphics_normal_color >> 4) | @@ -176,7 +216,11 @@ grub_printf("Failed to read splash image (%s)\n", splashimage); grub_printf("Press any key to continue..."); getkey(); +#ifdef __MINIOS__ + fb_close(); +#else set_videomode(saved_videomode); +#endif graphics_inited = 0; return 0; } @@ -190,8 +234,13 @@ void graphics_end(void) { if (graphics_inited) { +#ifdef __MINIOS__ + fb_close(); + free(VIDEOMEM); +#else unset_int1c_handler(); set_videomode(saved_videomode); +#endif graphics_inited = 0; no_cursor = 0; } @@ -204,15 +253,19 @@ graphics_cursor(0); if (ch == '\n') { + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); if (fonty + 1 < view_y1) graphics_setxy(fontx, fonty + 1); else graphics_scroll(); graphics_cursor(1); + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); return; } else if (ch == '\r') { + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); graphics_setxy(view_x0, fonty); graphics_cursor(1); + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); return; } @@ -224,6 +277,7 @@ text[fonty * 80 + fontx] |= 0x100; graphics_cursor(0); + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); if ((fontx + 1) >= view_x1) { graphics_setxy(view_x0, fonty); @@ -232,13 +286,16 @@ else graphics_scroll(); graphics_cursor(1); + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); do_more (); graphics_cursor(0); + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); } else { graphics_setxy(fontx + 1, fonty); } graphics_cursor(1); + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); } /* get the current location of the cursor */ @@ -248,10 +305,12 @@ void graphics_gotoxy(int x, int y) { graphics_cursor(0); + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); graphics_setxy(x, y); graphics_cursor(1); + fbfront_update(fb_dev, cursorX, cursorY, 8, 16); } void graphics_cls(void) { @@ -262,15 +321,21 @@ graphics_gotoxy(view_x0, view_y0); mem = (unsigned char*)VIDEOMEM; +#ifndef __MINIOS__ s1 = (unsigned char*)VSHADOW1; s2 = (unsigned char*)VSHADOW2; s4 = (unsigned char*)VSHADOW4; s8 = (unsigned char*)VSHADOW8; +#endif for (i = 0; i < 80 * 30; i++) text[i] = ' '; graphics_cursor(1); +#ifdef __MINIOS__ + memcpy(mem, VSHADOW, RAMSIZE); + fbfront_update(fb_dev, 0, 0, 640, 480); +#else BitMask(0xff); /* plane 1 */ @@ -290,6 +355,7 @@ grub_memcpy(mem, s8, 38400); MapMask(15); +#endif if (no_cursor) { no_cursor = 0; @@ -337,6 +403,11 @@ return 0; } +void graphics_set_palette(int idx, int red, int green, int blue) +{ + palette[idx] = (red << (16 + 2)) | (green << (8 + 2)) | (blue << 2); +} + /* Read in the splashscreen image and set the palette up appropriately. * Format of splashscreen is an xpm (can be gzipped) with 16 colors and * 640x480. */ @@ -413,18 +484,19 @@ } if (len == 6 && idx < 15) { - int r = ((hex(buf[0]) << 4) | hex(buf[1])) >> 2; - int g = ((hex(buf[2]) << 4) | hex(buf[3])) >> 2; - int b = ((hex(buf[4]) << 4) | hex(buf[5])) >> 2; + int r = ((hex(buf[0]) << 4) | hex(buf[1])); + int g = ((hex(buf[2]) << 4) | hex(buf[3])); + int b = ((hex(buf[4]) << 4) | hex(buf[5])); pal[idx] = base; - graphics_set_palette(idx, r, g, b); + graphics_set_palette(idx, r / 4, g / 4, b / 4); ++idx; } } x = y = len = 0; +#ifndef __MINIOS__ s1 = (unsigned char*)VSHADOW1; s2 = (unsigned char*)VSHADOW2; s4 = (unsigned char*)VSHADOW4; @@ -432,6 +504,7 @@ for (i = 0; i < 38400; i++) s1[i] = s2[i] = s4[i] = s8[i] = 0; +#endif /* parse xpm data */ while (y < height) { @@ -451,6 +524,9 @@ break; } +#ifdef __MINIOS__ + VSHADOW[x + y * 640] = palette[i]; +#else mask = 0x80 >> (x & 7); if (c & 1) s1[len + (x >> 3)] |= mask; @@ -460,6 +536,7 @@ s4[len + (x >> 3)] |= mask; if (c & 8) s8[len + (x >> 3)] |= mask; +#endif if (++x >= 640) { x = 0; @@ -494,7 +571,13 @@ } void graphics_cursor(int set) { - unsigned char *pat, *mem, *ptr, chr[16 << 2]; + unsigned char *pat; +#ifdef __MINIOS__ + uint32_t *mem, *ptr, chr[16 * 8]; + int j; +#else + unsigned char *mem, *ptr, chr[16 << 2]; +#endif int i, ch, invert, offset; if (set && (no_cursor || no_scroll)) @@ -505,71 +588,127 @@ invert = (text[fonty * 80 + fontx] & 0xff00) != 0; pat = font8x16 + (ch << 4); - mem = (unsigned char*)VIDEOMEM + offset; + mem = (unsigned char*)VIDEOMEM + offset +#ifdef __MINIOS__ + * 8 * 4 +#endif + ; if (!set) { for (i = 0; i < 16; i++) { unsigned char mask = pat[i]; if (!invert) { +#ifdef __MINIOS__ + memcpy(chr + i * 8, VSHADOW + offset * 8, 8 * 4); +#else chr[i ] = ((unsigned char*)VSHADOW1)[offset]; chr[16 + i] = ((unsigned char*)VSHADOW2)[offset]; chr[32 + i] = ((unsigned char*)VSHADOW4)[offset]; chr[48 + i] = ((unsigned char*)VSHADOW8)[offset]; +#endif if (shade) { if (ch == DISP_VERT || ch == DISP_LL || ch == DISP_UR || ch == DISP_LR) { unsigned char pmask = ~(pat[i] >> 1); +#ifdef __MINIOS__ + for (j = 0; j < 8; j++) + if (!(pmask & (1U << j))) + chr[i * 8 + (7 - j)] = palette[0]; +#else chr[i ] &= pmask; chr[16 + i] &= pmask; chr[32 + i] &= pmask; chr[48 + i] &= pmask; +#endif } if (i > 0 && ch != DISP_VERT) { unsigned char pmask = ~(pat[i - 1] >> 1); +#ifdef __MINIOS__ + for (j = 0; j < 8; j++) + if (!(pmask & (1U << j))) + chr[i * 8 + (7 - j)] = palette[0]; +#else chr[i ] &= pmask; chr[16 + i] &= pmask; chr[32 + i] &= pmask; chr[48 + i] &= pmask; +#endif if (ch == DISP_HORIZ || ch == DISP_UR || ch == DISP_LR) { pmask = ~pat[i - 1]; +#ifdef __MINIOS__ + for (j = 0; j < 8; j++) + if (!(pmask & (1U << j))) + chr[i * 8 + (7 - j)] = palette[0]; +#else chr[i ] &= pmask; chr[16 + i] &= pmask; chr[32 + i] &= pmask; chr[48 + i] &= pmask; +#endif } } } +#ifdef __MINIOS__ + for (j = 0; j < 8; j++) + if (mask & (1U << j)) + chr[i * 8 + (7 - j)] = palette[15]; +#else chr[i ] |= mask; chr[16 + i] |= mask; chr[32 + i] |= mask; chr[48 + i] |= mask; +#endif offset += 80; } else { +#ifdef __MINIOS__ + for (j = 0; j < 8; j++) + if (mask & (1U << j)) + chr[i * 8 + (7 - j)] = palette[15]; + else + chr[i * 8 + (7 - j)] = palette[0]; +#else chr[i ] = mask; chr[16 + i] = mask; chr[32 + i] = mask; chr[48 + i] = mask; +#endif } } } else { +#ifdef __MINIOS__ + ptr = mem; + for (i = 0; i < 16; i++, ptr += 80 * 8) + for (j = 0; j < 8; j++) { + if (pat[i] & (1U << (7 - j))) + cursorBuf32[i * 8 + j] = ptr[j] = palette[0]; + else + cursorBuf32[i * 8 + j] = ptr[j] = palette[15]; + } +#else MapMask(15); ptr = mem; for (i = 0; i < 16; i++, ptr += 80) { cursorBuf[i] = pat[i]; *ptr = ~pat[i]; } +#endif return; } offset = 0; +#ifdef __MINIOS__ + ptr = mem; + for (j = 0; j < 16; j++, ptr += 80 * 8) + memcpy(ptr, chr + j * 8 + offset * 8, 8 * 4); +#else for (i = 1; i < 16; i <<= 1, offset += 16) { int j; @@ -580,6 +719,7 @@ } MapMask(15); +#endif } #endif /* SUPPORT_GRAPHICS */ Index: grub/stage2/graphics.h =================================================================== --- grub.orig/stage2/graphics.h 2008-06-16 15:18:14.527010000 +0100 +++ grub/stage2/graphics.h 2008-06-16 15:18:14.805010000 +0100 @@ -21,8 +21,10 @@ #ifndef GRAPHICS_H #define GRAPHICS_H +#ifndef __MINIOS__ /* magic constant */ #define VIDEOMEM 0xA0000 +#endif /* function prototypes */ char *graphics_get_splash(void); Index: grub/stage2/stage2.c =================================================================== --- grub.orig/stage2/stage2.c 2008-06-17 11:06:47.873523000 +0100 +++ grub/stage2/stage2.c 2008-06-17 11:07:05.225628000 +0100 @@ -31,10 +31,10 @@ #if defined(PRESET_MENU_STRING) || defined(SUPPORT_DISKLESS) # if defined(PRESET_MENU_STRING) -static const char *preset_menu = PRESET_MENU_STRING; +const char *preset_menu = PRESET_MENU_STRING; # elif defined(SUPPORT_DISKLESS) /* Execute the command "bootp" automatically. */ -static const char *preset_menu = "bootp\n"; +const char *preset_menu = "bootp\n"; # endif /* SUPPORT_DISKLESS */ static int preset_menu_offset; Index: grub/stage2/fsys_xfs.c =================================================================== RCS file: /sources/grub/grub/stage2/fsys_xfs.c,v retrieving revision 1.5 diff -u -p -r1.5 fsys_xfs.c --- grub/stage2/fsys_xfs.c 8 May 2005 02:18:14 -0000 1.5 +++ grub/stage2/fsys_xfs.c 10 Jul 2008 13:09:50 -0000 @@ -101,7 +101,7 @@ static inline __const__ xfs_uint16_t le16 (xfs_uint16_t x) { __asm__("xchgb %b0,%h0" \ - : "=q" (x) \ + : "=Q" (x) \ : "0" (x)); \ return x; } @@ -109,9 +109,9 @@ le16 (xfs_uint16_t x) static inline __const__ xfs_uint32_t le32 (xfs_uint32_t x) { -#if 0 +#if 1 /* 386 doesn't have bswap. */ - __asm__("bswap %0" : "=r" (x) : "0" (x)); + __asm__("bswapl %k0" : "=r" (x) : "0" (x)); #else /* This is slower but this works on all x86 architectures. */ __asm__("xchgb %b0, %h0" \ --- grub.orig/stage2/gunzip.c 2010-03-07 23:03:34.000000000 +0100 +++ grub/stage2/gunzip.c 2010-03-07 23:05:36.000000000 +0100 @@ -141,7 +141,7 @@ static int gzip_filemax; static int gzip_fsmax; static int saved_filepos; -static unsigned long gzip_crc; +static unsigned int gzip_crc; /* internal extra variables for use of inflate code */ static int block_type; @@ -157,7 +157,7 @@ * Linear allocator. */ -static unsigned long linalloc_topaddr; +static unsigned int linalloc_topaddr; static void * linalloc (int size) @@ -253,7 +253,7 @@ typedef unsigned char uch; typedef unsigned short ush; -typedef unsigned long ulg; +typedef unsigned int ulg; /* * Window Size @@ -316,8 +316,8 @@ return 0; } - gzip_crc = *((unsigned long *) buf); - gzip_fsmax = gzip_filemax = *((unsigned long *) (buf + 4)); + gzip_crc = *((unsigned int *) buf); + gzip_fsmax = gzip_filemax = *((unsigned int *) (buf + 4)); initialize_tables (); diff -ur grub.orig/stage2/fsys_iso9660.c grub-upstream/stage2/fsys_iso9660.c --- grub.orig/stage2/fsys_iso9660.c 2010-03-07 23:39:00.000000000 +0100 +++ grub/stage2/fsys_iso9660.c 2010-03-07 23:39:56.000000000 +0100 @@ -43,7 +43,7 @@ /* iso fs inode data in memory */ struct iso_inode_info { - unsigned long file_start; + unsigned int file_start; }; #define ISO_SUPER \ @@ -88,12 +88,12 @@ if (byte_len <= 0) return 1; - sector += (byte_offset >> sector_size_lg2); - byte_offset &= (buf_geom.sector_size - 1); asm volatile ("shl%L0 %1,%0" : "=r"(sector) : "Ic"((int8_t)(ISO_SECTOR_BITS - sector_size_lg2)), "0"(sector)); + sector += (byte_offset >> sector_size_lg2); + byte_offset &= (buf_geom.sector_size - 1); #if !defined(STAGE1_5) if (disk_read_hook && debug)