Changeset eebd172 in mainline


Ignore:
Timestamp:
2006-03-13T19:58:00Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6323989
Parents:
272c219
Message:

relocate ppc32 kernel above 2 GB

Location:
arch/ppc32/loader
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/loader/_link.ld

    r272c219 reebd172  
    88
    99SECTIONS {
    10         .image 0x80000000: AT (0x80000000) {
     10        .image 0x10000000: AT (0) {
    1111                *(BOOTSTRAP)
    1212                *(.text);
  • arch/ppc32/loader/asm.S

    r272c219 reebd172  
    3939.global memsetb
    4040.global memcpy
     41.global flush_instruction_cache
    4142.global jump_to_kernel
    4243
     
    181182
    182183jump_to_kernel:
    183         mtspr SPRN_SRR0, r3
    184         mfmsr r3
    185         lis r4, ~0@h
    186         ori r4, r4, ~(MSR_IR | MSR_DR)@l
    187         and r3, r3, r4
    188         mtspr SPRN_SRR1, r3
    189         bl flush_instruction_cache
    190         rfi
     184        mtlr r3
     185        blr
     186
  • arch/ppc32/loader/asm.h

    r272c219 reebd172  
    3030#define __ASM_H__
    3131
     32void flush_instruction_cache(void);
    3233void jump_to_kernel(void *addr) __attribute__((noreturn));
    3334
  • arch/ppc32/loader/main.c

    r272c219 reebd172  
    3232#include "asm.h"
    3333
    34 #define KERNEL_LOAD_ADDRESS 0x400000
     34#define KERNEL_PHYSICAL_ADDRESS 0x1000
     35#define KERNEL_VIRTUAL_ADDRESS 0x80001000
    3536#define KERNEL_START &_binary_____________kernel_kernel_bin_start
    3637#define KERNEL_END &_binary_____________kernel_kernel_bin_end
     
    4142        printf("\nHelenOS PPC Bootloader\n");
    4243       
    43         void *loader = ofw_translate(&start);
    44         printf("loaded at %L (physical %L)\n", &start, loader);
    45         printf("kernel load address %L (size %d)\n", KERNEL_LOAD_ADDRESS, KERNEL_SIZE);
     44        void *phys = ofw_translate(&start);
     45        printf("loaded at %L (physical %L)\n", &start, phys);
    4646       
    47         void *addr = ofw_claim((void *) KERNEL_LOAD_ADDRESS, KERNEL_SIZE, 1);
    48         if (addr == NULL) {
    49                 printf("Error: Unable to claim memory");
     47        // FIXME: map just the kernel
     48        if (ofw_map((void *) KERNEL_PHYSICAL_ADDRESS, (void *) KERNEL_VIRTUAL_ADDRESS, 1024 * 1024, 0) != 0) {
     49                printf("Unable to map kernel memory at %L (physical %L)\n", KERNEL_VIRTUAL_ADDRESS, KERNEL_PHYSICAL_ADDRESS);
    5050                halt();
    5151        }
    52         printf("Claimed memory at %L\n", addr);
    53         memcpy(addr, KERNEL_START, KERNEL_SIZE);
     52        printf("kernel memory mapped at %L (physical %L, size %d bytes)\n", KERNEL_VIRTUAL_ADDRESS, KERNEL_PHYSICAL_ADDRESS, KERNEL_SIZE);
     53        // FIXME: relocate the kernel in real mode
     54        memcpy((void *) KERNEL_VIRTUAL_ADDRESS, KERNEL_START, KERNEL_SIZE);
     55       
     56        // FIXME: proper framebuffer mapping
     57        ofw_map((void *) 0x84000000, (void *) 0x84000000, 2 * 1024 * 1024, 0);
    5458       
    5559        printf("Booting the kernel...\n");
    56         jump_to_kernel(addr);
     60       
     61        flush_instruction_cache();
     62        jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS);
    5763}
  • arch/ppc32/loader/ofw.c

    r272c219 reebd172  
    7979        ofw(&args);
    8080       
    81         if (nret > 0)
    82                 return args.args[nargs + nret - 1];
    83         else
    84                 return 0;
     81        return args.args[nargs];
    8582}
    8683
     
    113110
    114111
    115 void *ofw_claim(const void *addr, const int size, const int align)
     112void *ofw_translate(const void *virt)
    116113{
    117         return (void *) ofw_call("claim", 3, 1, addr, size, align);
     114        return (void *) ofw_call("call-method", 7, 1, "translate", ofw_mmu, virt, 0, 0, 0, 0);
    118115}
    119116
    120117
    121 void *ofw_translate(const void *virt)
     118int ofw_map(const void *phys, const void *virt, const int size, const int mode)
    122119{
    123         return (void *) ofw_call_method(ofw_mmu, "translate", 1, 5, virt);
     120        return ofw_call("call-method", 6, 1, "map", ofw_mmu, mode, size, virt, phys);
    124121}
  • arch/ppc32/loader/ofw.h

    r272c219 reebd172  
    6161extern int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen);
    6262extern int ofw_call(const char *service, const int nargs, const int nret, ...);
    63 #define ofw_call_method(instance, method, nargs, nret, ...) ofw_call("call-method", (nargs + 2), nret, method, instance, ##__VA_ARGS__)
    6463
    6564extern ihandle ofw_open(const char *name);
    6665extern void ofw_write(const char *str, const int len);
    6766
    68 extern void *ofw_claim(const void *addr, const int size, const int align);
    6967extern void *ofw_translate(const void *virt);
     68extern int ofw_map(const void *phys, const void *virt, const int size, const int mode);
    7069
    7170#endif
Note: See TracChangeset for help on using the changeset viewer.