]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Prevent potential loss of memory map by overwrite on qemu-mips.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 17 May 2011 17:32:51 +0000 (19:32 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 17 May 2011 17:32:51 +0000 (19:32 +0200)
* grub-core/boot/mips/startup_raw.S [GRUB_MACHINE_MIPS_QEMU_MIPS]:
Save ram size in $s4.
* grub-core/kern/mips/qemu_mips/init.c (RAMSIZE): Removed.
All users changed to grub_arch_memsize.
* grub-core/kern/mips/startup.S (grub_arch_machine): Restrict to
Loongson.
[GRUB_MACHINE_MIPS_QEMU_MIPS]: Save grub_arch_memsize.
* grub-core/loader/mips/linux.c (grub_linux_boot): Pass memory size.
* include/grub/mips/qemu_mips/memory.h (grub_arch_memsize): New
external variable.

ChangeLog
grub-core/boot/mips/startup_raw.S
grub-core/kern/mips/qemu_mips/init.c
grub-core/kern/mips/startup.S
grub-core/loader/mips/linux.c
include/grub/mips/qemu_mips/memory.h

index ded0469a3b82c3b9d100d2c9d50c616f4d7b84a7..d1f01e727871ecce0b9d506dbed1ba8b32f537fe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2011-05-17  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Prevent potential loss of memory map by overwrite on qemu-mips.
+
+       * grub-core/boot/mips/startup_raw.S [GRUB_MACHINE_MIPS_QEMU_MIPS]:
+       Save ram size in $s4.
+       * grub-core/kern/mips/qemu_mips/init.c (RAMSIZE): Removed.
+       All users changed to grub_arch_memsize.
+       * grub-core/kern/mips/startup.S (grub_arch_machine): Restrict to
+       Loongson.
+       [GRUB_MACHINE_MIPS_QEMU_MIPS]: Save grub_arch_memsize.
+       * grub-core/loader/mips/linux.c (grub_linux_boot): Pass memory size.
+       * include/grub/mips/qemu_mips/memory.h (grub_arch_memsize): New
+       external variable.
+
 2011-05-17  Colin Watson  <cjwatson@ubuntu.com>
 
        * .bzrignore: Remove grub-dumpbios.
index e69de26c2c45e71f71b8eb151e7f81c782e6ce67..65a2dd59ea3f79046f4dd1a3c789098731ddd4ac 100644 (file)
@@ -50,6 +50,11 @@ codestart:
 
        /* Parse arguments. Has to be done before relocation.
        So need to do it in asm.  */
+#ifdef GRUB_MACHINE_MIPS_QEMU_MIPS
+       lui $t0, %hi (((16 << 20) - 264) | 0x80000000)
+       lw $s4, %lo (((16 << 20) - 264) | 0x80000000) ($t0)
+#endif
+
 #ifdef GRUB_MACHINE_MIPS_LOONGSON
        move $s2, $zero
        move $s3, $zero
index b3155eab5e11505c4f8d1aafeeead236e831aefe..e426b833dc66063fa64f8d4f89d5bdad652e7b74 100644 (file)
@@ -10,8 +10,6 @@
 #include <grub/cpu/memory.h>
 #include <grub/memory.h>
 
-#define RAMSIZE (*(grub_uint32_t *) ((16 << 20) - 264))
-
 extern void grub_serial_init (void);
 extern void grub_terminfo_init (void);
 
@@ -24,7 +22,7 @@ grub_machine_init (void)
   grub_arch_cpuclock = 64000000;
 
   modend = grub_modules_get_end ();
-  grub_mm_init_region ((void *) modend, RAMSIZE
+  grub_mm_init_region ((void *) modend, grub_arch_memsize
                       - (modend - GRUB_ARCH_LOWMEMVSTART));
 
   grub_install_get_time_ms (grub_rtc_get_time_ms);
@@ -59,6 +57,6 @@ grub_reboot (void)
 grub_err_t 
 grub_machine_mmap_iterate (grub_memory_hook_t hook)
 {
-  hook (0, RAMSIZE, GRUB_MEMORY_AVAILABLE);
+  hook (0, grub_arch_memsize, GRUB_MEMORY_AVAILABLE);
   return GRUB_ERR_NONE;
 }
index 1472aaf8c53b6d9a6d3962367d83de65f38fea93..2654d744efd45cb968027818eefafa31e3c38ef4 100644 (file)
@@ -59,12 +59,20 @@ VARIABLE (grub_arch_memsize)
        .long 0
 VARIABLE (grub_arch_highmemsize)
        .long 0
+#ifdef GRUB_MACHINE_MIPS_LOONGSON
 VARIABLE (grub_arch_machine)
        .long GRUB_ARCH_MACHINE_FULOONG
+#endif
 cont:
        /* Save our base.  */
        move $s0, $ra
 
+#ifdef GRUB_MACHINE_MIPS_QEMU_MIPS
+       lui $t1, %hi(grub_arch_busclock)
+       addiu $t1, %lo(grub_arch_busclock)
+       sw $s4, 8($t1)
+#endif
+
 #ifdef GRUB_MACHINE_MIPS_LOONGSON
        lui $t1, %hi(grub_arch_busclock)
        addiu $t1, %lo(grub_arch_busclock)
index 722be36a9bc9138a3c978edc0eb1b3f5682595a2..64c4a0531f8fb719f26c3d17491b075458cdbd52 100644 (file)
@@ -80,13 +80,21 @@ grub_linux_boot (void)
   {
     grub_err_t err;
     grub_relocator_chunk_t ch;
+    grub_uint32_t *memsize;
+    grub_uint32_t *magic;
+    char *str;
 
     err = grub_relocator_alloc_chunk_addr (relocator, &ch,
-                                          ((16 << 20) - 256),
-                                          grub_strlen (params) + 1);
+                                          ((16 << 20) - 264),
+                                          grub_strlen (params) + 1 + 8);
     if (err)
       return err;
-    grub_strcpy (get_virtual_current_address (ch), params);
+    memsize = get_virtual_current_address (ch);
+    magic = memsize + 1;
+    *memsize = grub_mmap_get_lower ();
+    *magic = 0x12345678;
+    str = (char *) (magic + 1);
+    grub_strcpy (str, params);
   }
 #endif  
 
index 7a7ff143e51354210346cc0768bdd66db250c140..48a9b69f03f51742991d53f07073aaac4b22c8d6 100644 (file)
@@ -29,6 +29,9 @@
 #define GRUB_MACHINE_MEMORY_USABLE       0x81000000
 
 #ifndef ASM_FILE
+
+extern grub_uint32_t grub_arch_memsize;
+
 static inline grub_err_t
 grub_machine_mmap_register (grub_uint64_t start __attribute__ ((unused)),
                            grub_uint64_t size __attribute__ ((unused)),