grub_size_t size,
grub_uint32_t align);
+extern grub_addr_t EXPORT_VAR (grub_ieee1275_original_stack);
+
#endif /* ! GRUB_IEEE1275_MACHINE_HEADER */
#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"
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
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
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
#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)
{
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
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[];
grub_linux_boot (void)
{
struct linux_bootstr_info *bp;
- kernel_entry_t linuxmain;
struct linux_hdrs *hp;
grub_addr_t addr;
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;
}