Changeset 6323989 in mainline
- Timestamp:
- 2006-03-14T09:11:07Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2d69ee6
- Parents:
- eebd172
- Location:
- arch/ppc32/loader
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ppc32/loader/_link.ld
reebd172 r6323989 19 19 *(.sbss); 20 20 *(.bss); /* uninitialized static variables */ 21 *(COMMON); /* global variables */ 21 22 } 22 23 } -
arch/ppc32/loader/asm.S
reebd172 r6323989 182 182 183 183 jump_to_kernel: 184 mr r10, r4 184 185 mtlr r3 185 186 blr -
arch/ppc32/loader/asm.h
reebd172 r6323989 31 31 32 32 void flush_instruction_cache(void); 33 void jump_to_kernel(void * addr) __attribute__((noreturn));33 void jump_to_kernel(void *code, void *memmap) __attribute__((noreturn)); 34 34 35 35 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) -
arch/ppc32/loader/main.c
reebd172 r6323989 29 29 #include "main.h" 30 30 #include "printf.h" 31 #include "ofw.h"32 31 #include "asm.h" 33 32 … … 38 37 #define KERNEL_SIZE ((unsigned int) KERNEL_END - (unsigned int) KERNEL_START) 39 38 39 memmap_t memmap; 40 40 41 void bootstrap(void) 41 42 { … … 44 45 void *phys = ofw_translate(&start); 45 46 printf("loaded at %L (physical %L)\n", &start, phys); 47 48 if (!ofw_memmap(&memmap)) { 49 printf("Unable to get memory map\n"); 50 halt(); 51 } 52 printf("total memory %d MB\n", memmap.total >> 20); 46 53 47 54 // FIXME: map just the kernel … … 60 67 61 68 flush_instruction_cache(); 62 jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS );69 jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, ofw_translate(&memmap)); 63 70 } -
arch/ppc32/loader/main.h
reebd172 r6323989 30 30 #define __MAIN_H__ 31 31 32 #include "ofw.h" 33 32 34 extern int _binary_____________kernel_kernel_bin_start; 33 35 extern int _binary_____________kernel_kernel_bin_end; … … 35 37 extern void bootstrap(void); 36 38 39 extern memmap_t memmap; 40 37 41 #endif -
arch/ppc32/loader/ofw.c
reebd172 r6323989 30 30 #include "printf.h" 31 31 32 #define MAX_OFW_ARGS 10 33 34 typedef unsigned int ofw_arg_t; 35 typedef unsigned int ihandle; 36 typedef unsigned int phandle; 37 38 /** OpenFirmware command structure 39 * 40 */ 41 typedef struct { 42 const char *service; /**< Command name */ 43 unsigned int nargs; /**< Number of in arguments */ 44 unsigned int nret; /**< Number of out arguments */ 45 ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */ 46 } ofw_args_t; 47 48 typedef void (*ofw_entry)(ofw_args_t *); 49 50 32 51 ofw_entry ofw; 33 52 … … 37 56 38 57 39 void init(void) 40 { 41 ofw_chosen = ofw_find_device("/chosen"); 42 if (ofw_chosen == -1) 43 halt(); 44 45 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) 46 ofw_stdout = 0; 47 48 ofw_mmu = ofw_open("/mmu"); 49 if (ofw_mmu == -1) { 50 puts("Unable to open /mmu node\n"); 51 halt(); 52 } 53 } 54 55 void halt(void) 56 { 57 ofw_call("exit", 0, 0); 58 } 59 60 61 int ofw_call(const char *service, const int nargs, const int nret, ...) 58 static int ofw_call(const char *service, const int nargs, const int nret, ...) 62 59 { 63 60 va_list list; … … 83 80 84 81 85 ihandle ofw_open(const char *name) 82 static phandle ofw_find_device(const char *name) 83 { 84 return ofw_call("finddevice", 1, 1, name); 85 } 86 87 88 static int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen) 89 { 90 return ofw_call("getprop", 4, 1, device, name, buf, buflen); 91 } 92 93 static ihandle ofw_open(const char *name) 86 94 { 87 95 return ofw_call("open", 1, 1, name); 96 } 97 98 99 void init(void) 100 { 101 ofw_chosen = ofw_find_device("/chosen"); 102 if (ofw_chosen == -1) 103 halt(); 104 105 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) 106 ofw_stdout = 0; 107 108 ofw_mmu = ofw_open("/mmu"); 109 if (ofw_mmu == -1) { 110 puts("Unable to open /mmu node\n"); 111 halt(); 112 } 113 } 114 115 116 void halt(void) 117 { 118 ofw_call("exit", 0, 0); 88 119 } 89 120 … … 95 126 96 127 ofw_call("write", 3, 1, ofw_stdout, str, len); 97 }98 99 100 phandle ofw_find_device(const char *name)101 {102 return ofw_call("finddevice", 1, 1, name);103 }104 105 106 int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)107 {108 return ofw_call("getprop", 4, 1, device, name, buf, buflen);109 128 } 110 129 … … 120 139 return ofw_call("call-method", 6, 1, "map", ofw_mmu, mode, size, virt, phys); 121 140 } 141 142 143 int ofw_memmap(memmap_t *map) 144 { 145 int i; 146 int ret; 147 148 phandle handle = ofw_find_device("/memory"); 149 if (handle == -1) 150 return false; 151 152 ret = ofw_get_property(handle, "reg", &map->zones, sizeof(map->zones)); 153 if (ret == -1) 154 return false; 155 156 map->total = 0; 157 map->count = 0; 158 for (i = 0; i < MEMMAP_MAX_RECORDS; i++) { 159 if (map->zones[i].size == 0) 160 break; 161 map->count++; 162 map->total += map->zones[i].size; 163 } 164 } -
arch/ppc32/loader/ofw.h
reebd172 r6323989 30 30 #define __OFW_H__ 31 31 32 #define NULL 0 33 #define MAX_OFW_ARGS 10 32 #define NULL 0 33 #define MEMMAP_MAX_RECORDS 32 34 #define false 0 35 #define true 1 34 36 35 37 typedef __builtin_va_list va_list; … … 39 41 #define va_end(ap) __builtin_va_end(ap) 40 42 41 typedef unsigned int ofw_arg_t; 42 typedef unsigned int ihandle; 43 typedef unsigned int phandle; 43 typedef struct { 44 void *start; 45 unsigned int size; 46 } memzone_t; 44 47 45 /** OpenFirmware command structure46 *47 */48 48 typedef struct { 49 const char *service; /**< Command name */ 50 unsigned int nargs; /**< Number of in arguments */ 51 unsigned int nret; /**< Number of out arguments */ 52 ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */ 53 } ofw_args_t; 49 unsigned int total; 50 unsigned int count; 51 memzone_t zones[MEMMAP_MAX_RECORDS]; 52 } memmap_t; 54 53 55 typedef void (*ofw_entry)(ofw_args_t *);56 54 57 55 extern void init(void); 58 void halt(void);56 extern void halt(void); 59 57 60 extern phandle ofw_find_device(const char *name);61 extern int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen);62 extern int ofw_call(const char *service, const int nargs, const int nret, ...);63 64 extern ihandle ofw_open(const char *name);65 58 extern void ofw_write(const char *str, const int len); 66 59 67 60 extern void *ofw_translate(const void *virt); 68 61 extern int ofw_map(const void *phys, const void *virt, const int size, const int mode); 62 extern int ofw_memmap(memmap_t *map); 69 63 70 64 #endif
Note:
See TracChangeset
for help on using the changeset viewer.