Increase stack size on sparc
This commit is contained in:
parent
10f6389453
commit
320dd174b5
5 changed files with 32 additions and 10 deletions
|
@ -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 */
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -23,12 +23,15 @@
|
|||
#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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue