]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Increase stack size on sparc
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 14 Feb 2010 13:32:21 +0000 (14:32 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 14 Feb 2010 13:32:21 +0000 (14:32 +0100)
include/grub/sparc64/ieee1275/ieee1275.h
include/grub/sparc64/ieee1275/kernel.h
kern/sparc64/ieee1275/crt0.S
kern/sparc64/ieee1275/init.c
loader/sparc64/ieee1275/linux.c

index 527c46ae7558486b4121a625c5eb46eaa86b9e86..32c77f80f1a136c0127aecb6d5643ebd64cb5e88 100644 (file)
@@ -43,4 +43,6 @@ extern int EXPORT_FUNC(grub_ieee1275_alloc_physmem) (grub_addr_t *paddr,
                                                     grub_size_t size,
                                                     grub_uint32_t align);
 
+extern grub_addr_t EXPORT_VAR (grub_ieee1275_original_stack);
+
 #endif /* ! GRUB_IEEE1275_MACHINE_HEADER */
index 78e039bc53d86dfd28085e8b9bc1df780546869e..a16fb88e7aaf326ebe5870e1e67137c05351d1bd 100644 (file)
@@ -40,6 +40,7 @@
 #define GRUB_KERNEL_MACHINE_DATA_END           0x114
 
 #define GRUB_KERNEL_MACHINE_RAW_SIZE                   0
+#define GRUB_KERNEL_MACHINE_STACK_SIZE          0x40000
 
 #define GRUB_PLATFORM_IMAGE_FORMATS     "raw, aout"
 #define GRUB_PLATFORM_IMAGE_DEFAULT_FORMAT     "raw"
index f1ff6b466c3c4974458e328d64100b8df5c29ced..d5a1722962f4791cc250727b720addad8bedfbdc 100644 (file)
@@ -53,8 +53,17 @@ codestart:
        or      %o3, %lo(_end), %o3
        sethi   %hi(grub_total_module_size), %o4
        lduw    [%o4 + %lo(grub_total_module_size)], %o4
+
        add     %o2, %o4, %o2
        add     %o3, %o4, %o3
+
+       /* Save ieee1275 stack for future use by booter.  */
+       mov     %o6, %o1
+       /* Our future stack.  */
+       sethi   %hi(GRUB_KERNEL_MACHINE_STACK_SIZE - 2047), %o5
+       or      %o5, %lo(GRUB_KERNEL_MACHINE_STACK_SIZE - 2047), %o5
+       add     %o3, %o5, %o6
+       
        sub     %o2, 4, %o2
        sub     %o3, 4, %o3
 1:     lduw    [%o2], %o5
@@ -62,7 +71,7 @@ codestart:
        subcc   %o4, 4, %o4
        sub     %o2, 4, %o2
        bne,pt  %icc, 1b
-         sub   %o3, 4, %o3
+        sub    %o3, 4, %o3
 
        /* Now it's safe to clear out the BSS.  */
        sethi   %hi(__bss_start), %o2
@@ -74,8 +83,9 @@ codestart:
        cmp     %o2, %o3
        blt,pt  %xcc, 1b
         nop
+       sethi   %hi(grub_ieee1275_original_stack), %o2
+       stx     %o1, [%o2 + %lo(grub_ieee1275_original_stack)]
        sethi   %hi(grub_ieee1275_entry_fn), %o2
-       stx     %o0, [%o2 + %lo(grub_ieee1275_entry_fn)]
        call    grub_main
-        nop
+        stx    %o0, [%o2 + %lo(grub_ieee1275_entry_fn)]
 1:     ba,a    1b
index 5827be65878e85bad50b0303c1741030ceb75171..a995217bcf153559fbdcfdceffd0f020f8f35ae6 100644 (file)
 #include <grub/err.h>
 #include <grub/misc.h>
 #include <grub/time.h>
+#include <grub/machine/boot.h>
 #include <grub/machine/console.h>
 #include <grub/machine/kernel.h>
 #include <grub/machine/time.h>
 #include <grub/ieee1275/ofdisk.h>
 #include <grub/ieee1275/ieee1275.h>
 
+grub_addr_t grub_ieee1275_original_stack;
+
 void
 grub_exit (void)
 {
@@ -104,7 +107,8 @@ grub_machine_set_prefix (void)
 static void
 grub_heap_init (void)
 {
-  grub_mm_init_region ((void *) grub_modules_get_end (), 0x200000);
+  grub_mm_init_region ((void *) (grub_modules_get_end ()
+                                + GRUB_KERNEL_MACHINE_STACK_SIZE), 0x200000);
 }
 
 static void
index 24a6849a6646719156837a4c1454350c40821e79..f55b4fa2afd7f3d5620e2b7abadbdb491ec6ae19 100644 (file)
@@ -58,9 +58,6 @@ static grub_size_t linux_size;
 
 static char *linux_args;
 
-typedef void (*kernel_entry_t) (unsigned long, unsigned long,
-                               unsigned long, unsigned long, int (void *));
-
 struct linux_bootstr_info {
        int len, valid;
        char buf[];
@@ -92,7 +89,6 @@ static grub_err_t
 grub_linux_boot (void)
 {
   struct linux_bootstr_info *bp;
-  kernel_entry_t linuxmain;
   struct linux_hdrs *hp;
   grub_addr_t addr;
 
@@ -141,8 +137,17 @@ grub_linux_boot (void)
   grub_dprintf ("loader", "Jumping to Linux...\n");
 
   /* Boot the kernel.  */
-  linuxmain = (kernel_entry_t) linux_addr;
-  linuxmain (0, 0, 0, 0, grub_ieee1275_entry_fn);
+  asm volatile ("sethi %hi(grub_ieee1275_entry_fn), %o1\n"
+               "ldx    [%o1 + %lo(grub_ieee1275_entry_fn)], %o4\n"
+               "sethi  %hi(grub_ieee1275_original_stack), %o1\n"
+               "ldx    [%o1 + %lo(grub_ieee1275_original_stack)], %o6\n"
+               "sethi  %hi(linux_addr), %o1\n"
+               "ldx    [%o1 + %lo(linux_addr)], %o5\n"
+               "mov    %g0, %o0\n"
+               "mov    %g0, %o2\n"
+               "mov    %g0, %o3\n"
+               "jmp    %o5\n"
+               "mov    %g0, %o1\n");
 
   return GRUB_ERR_NONE;
 }