Changeset eebd172 in mainline
- Timestamp:
- 2006-03-13T19:58:00Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6323989
- Parents:
- 272c219
- Location:
- arch/ppc32/loader
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ppc32/loader/_link.ld
r272c219 reebd172 8 8 9 9 SECTIONS { 10 .image 0x 80000000: AT (0x80000000) {10 .image 0x10000000: AT (0) { 11 11 *(BOOTSTRAP) 12 12 *(.text); -
arch/ppc32/loader/asm.S
r272c219 reebd172 39 39 .global memsetb 40 40 .global memcpy 41 .global flush_instruction_cache 41 42 .global jump_to_kernel 42 43 … … 181 182 182 183 jump_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 30 30 #define __ASM_H__ 31 31 32 void flush_instruction_cache(void); 32 33 void jump_to_kernel(void *addr) __attribute__((noreturn)); 33 34 -
arch/ppc32/loader/main.c
r272c219 reebd172 32 32 #include "asm.h" 33 33 34 #define KERNEL_LOAD_ADDRESS 0x400000 34 #define KERNEL_PHYSICAL_ADDRESS 0x1000 35 #define KERNEL_VIRTUAL_ADDRESS 0x80001000 35 36 #define KERNEL_START &_binary_____________kernel_kernel_bin_start 36 37 #define KERNEL_END &_binary_____________kernel_kernel_bin_end … … 41 42 printf("\nHelenOS PPC Bootloader\n"); 42 43 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); 46 46 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); 50 50 halt(); 51 51 } 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); 54 58 55 59 printf("Booting the kernel...\n"); 56 jump_to_kernel(addr); 60 61 flush_instruction_cache(); 62 jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS); 57 63 } -
arch/ppc32/loader/ofw.c
r272c219 reebd172 79 79 ofw(&args); 80 80 81 if (nret > 0) 82 return args.args[nargs + nret - 1]; 83 else 84 return 0; 81 return args.args[nargs]; 85 82 } 86 83 … … 113 110 114 111 115 void *ofw_ claim(const void *addr, const int size, const int align)112 void *ofw_translate(const void *virt) 116 113 { 117 return (void *) ofw_call("c laim", 3, 1, addr, size, align);114 return (void *) ofw_call("call-method", 7, 1, "translate", ofw_mmu, virt, 0, 0, 0, 0); 118 115 } 119 116 120 117 121 void *ofw_translate(const void *virt)118 int ofw_map(const void *phys, const void *virt, const int size, const int mode) 122 119 { 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); 124 121 } -
arch/ppc32/loader/ofw.h
r272c219 reebd172 61 61 extern int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen); 62 62 extern 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__)64 63 65 64 extern ihandle ofw_open(const char *name); 66 65 extern void ofw_write(const char *str, const int len); 67 66 68 extern void *ofw_claim(const void *addr, const int size, const int align);69 67 extern void *ofw_translate(const void *virt); 68 extern int ofw_map(const void *phys, const void *virt, const int size, const int mode); 70 69 71 70 #endif
Note:
See TracChangeset
for help on using the changeset viewer.