- Protect multiboot info from being overwritten
authorGé van Geldorp <ge@gse.nl>
Thu, 21 Apr 2005 09:29:02 +0000 (09:29 +0000)
committerGé van Geldorp <ge@gse.nl>
Thu, 21 Apr 2005 09:29:02 +0000 (09:29 +0000)
- Pass command line to MachInit() funcs

svn path=/trunk/; revision=14725

reactos/boot/freeldr/freeldr/arch/i386/arch.S
reactos/boot/freeldr/freeldr/arch/i386/archmach.c
reactos/boot/freeldr/freeldr/arch/i386/machpc.c
reactos/boot/freeldr/freeldr/arch/i386/machpc.h
reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
reactos/boot/freeldr/freeldr/arch/i386/machxbox.h
reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
reactos/boot/freeldr/freeldr/freeldr.c
reactos/boot/freeldr/freeldr/include/machine.h

index ee6ee68..5780cea 100644 (file)
@@ -275,9 +275,11 @@ EXTERN(_DisableA20)
  * other boot loaders like Grub
  */
 
+#define MB_INFO_SIZE                90
 #define MB_INFO_FLAGS_OFFSET        0
 #define MB_INFO_BOOT_DEVICE_OFFSET  12
 #define MB_INFO_COMMAND_LINE_OFFSET 16
+#define CMDLINE_SIZE                256
 
 /*
  * We want to execute at 0x8000 (to be compatible with bootsector
@@ -285,7 +287,6 @@ EXTERN(_DisableA20)
  * above 1MB. So we let Grub load us there and then relocate
  * ourself to 0x8000
  */
-#define CMDLINE_BASE 0x7000
 #define FREELDR_BASE 0x8000
 #define INITIAL_BASE 0x200000
 
@@ -328,6 +329,31 @@ mb1:
        movw    %dx,%ds
        movw    %dx,%es
 
+       /* Check for valid multiboot signature */
+       cmpl    $MULTIBOOT_BOOTLOADER_MAGIC,%eax
+       jne     mbfail
+
+       /* Store multiboot info in a safe place */
+       movl    %ebx,%esi
+       movl    $(mb_info + INITIAL_BASE - FREELDR_BASE),%edi
+       movl    $MB_INFO_SIZE,%ecx
+       rep movsb
+
+       /* Save commandline */
+       movl    MB_INFO_FLAGS_OFFSET(%ebx),%edx
+       testl   $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx)
+       jz      mb3
+       movl    MB_INFO_COMMAND_LINE_OFFSET(%ebx),%esi
+       movl    $(cmdline + INITIAL_BASE - FREELDR_BASE),%edi
+       movl    $CMDLINE_SIZE,%ecx
+mb2:   lodsb
+       stosb
+       testb   %al,%al
+       jz      mb3
+       dec     %ecx
+       jnz     mb2
+mb3:
+
        /* Copy to low mem */
        movl    $INITIAL_BASE,%esi
        movl    $FREELDR_BASE,%edi
@@ -342,8 +368,8 @@ mb1:
 
        /* Clear prefetch queue & correct CS,
         * jump to low mem */
-       ljmp    $PMODE_CS, $mb2
-mb2:
+       ljmp    $PMODE_CS, $mb4
+mb4:
        /* Reload segment selectors */
        movw    $PMODE_DS,%dx
        movw    %dx,%ds
@@ -353,39 +379,28 @@ mb2:
        movw    %dx,%ss
        movl    $STACK32ADDR,%esp
 
-       /* Check for valid multiboot signature */
-       cmpl    $MULTIBOOT_BOOTLOADER_MAGIC,%eax
-       jne     mbfail
-
+       movl    $mb_info,%ebx
        /* See if the boot device was passed in */
        movl    MB_INFO_FLAGS_OFFSET(%ebx),%edx
        testl   $MB_INFO_FLAG_BOOT_DEVICE,%edx
-       jz      mb3
+       jz      mb5
        /* Retrieve boot device info */
        movl    MB_INFO_BOOT_DEVICE_OFFSET(%ebx),%eax
        shrl    $16,%eax
        incb    %al
        movb    %al,_i386BootPartition
        movb    %ah,_i386BootDrive
-       jmp     mb4
-mb3:   /* No boot device known, assume first partition of first harddisk */
+       jmp     mb6
+mb5:   /* No boot device known, assume first partition of first harddisk */
        movb    $0x80,_i386BootDrive
        movb    $1,_i386BootPartition
-mb4:
-
-       /* Check for a command line */
-       xorl    %eax,%eax
-       testl   $MB_INFO_FLAG_COMMAND_LINE,%edx
-       jz      mb6
-       /* Copy command line to low mem*/
-       movl    MB_INFO_COMMAND_LINE_OFFSET(%ebx),%esi
-       movl    $CMDLINE_BASE,%edi
-mb5:   lodsb
-       stosb
-       testb   %al,%al
-       jnz     mb5
-       movl    $CMDLINE_BASE,%eax
 mb6:
+       /* Check for command line */
+       mov     $cmdline,%eax
+       testl   $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx)
+       jnz     mb7
+       xorl    %eax,%eax
+mb7:
 
        /* GO! */
        pushl   %eax    
@@ -467,3 +482,10 @@ EXTERN(_i386BootDrive)
 
 EXTERN(_i386BootPartition)
        .long   0
+
+.bss
+mb_info:
+       .fill   MB_INFO_SIZE, 1, 0
+
+cmdline:
+       .fill   CMDLINE_SIZE, 1, 0
index 347d8f5..c8171b0 100644 (file)
@@ -27,7 +27,7 @@
 #include "rtl.h"
 
 VOID
-MachInit(VOID)
+MachInit(char *CmdLine)
 {
   ULONG PciId;
 
@@ -39,11 +39,11 @@ MachInit(VOID)
   PciId = READ_PORT_ULONG((ULONG*) 0xcfc);
   if (0x02a510de == PciId)
     {
-      XboxMachInit();
+      XboxMachInit(CmdLine);
     }
   else
     {
-      PcMachInit();
+      PcMachInit(CmdLine);
     }
 
   HalpCalibrateStallExecution();
index e35583d..8bbe0ca 100644 (file)
@@ -26,7 +26,7 @@
 #include "i386.h"
 
 VOID
-PcMachInit(VOID)
+PcMachInit(char *CmdLine)
 {
   EnableA20();
 
index 5462a10..7a2a6eb 100644 (file)
@@ -26,7 +26,7 @@
 #include "mm.h"
 #endif
 
-VOID PcMachInit(VOID);
+VOID PcMachInit(char *CmdLine);
 
 VOID PcConsPutChar(int Ch);
 BOOL PcConsKbHit();
index 37819da..bbb3ca8 100644 (file)
@@ -24,7 +24,7 @@
 #include "i386.h"
 
 VOID
-XboxMachInit(VOID)
+XboxMachInit(char *CmdLine)
 {
   /* Initialize our stuff */
   XboxMemInit();
index 845f242..d82cdc8 100644 (file)
@@ -26,7 +26,7 @@
 
 UCHAR XboxFont8x16[256 * 16];
 
-VOID XboxMachInit(VOID);
+VOID XboxMachInit(char *CmdLine);
 
 VOID XboxConsPutChar(int Ch);
 BOOL XboxConsKbHit();
index b5405cc..071ec9e 100644 (file)
@@ -279,7 +279,7 @@ void PpcInit( of_proxy the_ofproxy ) {
     BootMain("freeldr-ppc");    
 }
 
-void MachInit() {
+void MachInit(char *CmdLine) {
     int len;
     printf( "Determining boot device:\n" );
     len = ofw_getprop(chosen_package, "bootpath", 
index d1a6b56..0a2259a 100644 (file)
@@ -31,7 +31,7 @@ VOID BootMain(char *CmdLine)
 {
        CmdLineParse(CmdLine);
 
-       MachInit();
+       MachInit(CmdLine);
 
        DebugInit();
 
index 3f917ae..5879d2e 100644 (file)
@@ -71,7 +71,7 @@ typedef struct tagMACHVTBL
   VOID (*HwDetect)(VOID);
 } MACHVTBL, *PMACHVTBL;
 
-VOID MachInit(VOID);
+VOID MachInit(char *CmdLine);
 
 extern MACHVTBL MachVtbl;