Changeset 63cda71 in mainline
- Timestamp:
- 2006-07-13T14:58:57Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 94d614e
- Parents:
- eda7bf81
- Files:
-
- 5 added
- 24 edited
- 3 moved
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/ppc32/loader/Makefile
reda7bf81 r63cda71 51 51 SOURCES = \ 52 52 main.c \ 53 ofw .c \53 ofwarch.c \ 54 54 ../../../genarch/ofw.c \ 55 55 ../../../generic/printf.c \ -
boot/arch/ppc32/loader/asm.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef __ASM_H__30 #define __ASM_H__29 #ifndef BOOT_ppc32_ASM_H_ 30 #define BOOT_ppc32_ASM_H_ 31 31 32 32 #define PAGE_SIZE 4096 -
boot/arch/ppc32/loader/boot.S
reda7bf81 r63cda71 38 38 stw r5, 0(r4) 39 39 40 bl init40 bl ofw_init 41 41 42 42 b bootstrap -
boot/arch/ppc32/loader/main.c
reda7bf81 r63cda71 31 31 #include "asm.h" 32 32 #include "_components.h" 33 #include <ofw.h> 34 #include <align.h> 33 35 34 36 #define HEAP_GAP 1024000 -
boot/arch/ppc32/loader/main.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef __MAIN_H__30 #define __MAIN_H__29 #ifndef BOOT_ppc32_MAIN_H_ 30 #define BOOT_ppc32_MAIN_H_ 31 31 32 32 #include "ofw.h" 33 34 /** Align to the nearest higher address.35 *36 * @param addr Address or size to be aligned.37 * @param align Size of alignment, must be power of 2.38 */39 #define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1))40 33 41 34 #define TASKMAP_MAX_RECORDS 32 -
boot/arch/ppc32/loader/ofwarch.c
reda7bf81 r63cda71 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 28 29 #include <ofwarch.h> 29 30 #include <ofw.h> 30 31 #include <printf.h> … … 56 57 if (ofw_get_property(device, "assigned-addresses", &macio, sizeof(macio)) <= 0) 57 58 return false; 58 keyboard->addr = macio.addr.addr_lo;59 keyboard->addr = (void *) macio.addr.addr_lo; 59 60 keyboard->size = macio.size_lo; 60 61 -
boot/arch/ppc32/loader/ofwarch.h
reda7bf81 r63cda71 1 1 /* 2 * Copyright (C) 200 5 Martin Decky2 * Copyright (C) 2006 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 29 #include <ofw.h>30 #include <printf.h>31 28 32 void write(const char *str, const int len) 33 { 34 int i; 35 36 for (i = 0; i < len; i++) { 37 if (str[i] == '\n') 38 ofw_write("\r", 1); 39 ofw_write(&str[i], 1); 40 } 41 } 29 #ifndef BOOT_ppc32_OFWARCH_H_ 30 #define BOOT_ppc32_OFWARCH_H_ 42 31 43 int ofw_translate_failed(ofw_arg_t flag) 44 { 45 return flag != -1; 46 } 32 #define OFW_ADDRESS_CELLS 1 33 #define OFW_SIZE_CELLS 1 34 35 #endif -
boot/arch/ppc32/loader/types.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef TYPES_H__30 #define TYPES_H__29 #ifndef BOOT_ppc32_TYPES_H_ 30 #define BOOT_ppc32_TYPES_H_ 31 31 32 32 #include <gentypes.h> -
boot/arch/ppc64/loader/Makefile
reda7bf81 r63cda71 52 52 SOURCES = \ 53 53 main.c \ 54 ofwarch.c \ 54 55 ../../../genarch/ofw.c \ 55 56 ../../../generic/printf.c \ -
boot/arch/ppc64/loader/boot.S
reda7bf81 r63cda71 38 38 stw r5, 0(r4) 39 39 40 bl init40 bl ofw_init 41 41 42 42 b bootstrap -
boot/arch/ppc64/loader/main.c
reda7bf81 r63cda71 31 31 #include "asm.h" 32 32 #include "_components.h" 33 #include <ofw.h> 33 34 34 35 #define HEAP_GAP 1024000 -
boot/arch/ppc64/loader/main.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef __MAIN_H__30 #define __MAIN_H__29 #ifndef BOOT_ppc64_MAIN_H_ 30 #define BOOT_ppc64_MAIN_H_ 31 31 32 #include "ofw.h" 33 34 /** Align to the nearest higher address. 35 * 36 * @param addr Address or size to be aligned. 37 * @param align Size of alignment, must be power of 2. 38 */ 39 #define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1)) 32 #include <ofw.h> 40 33 41 34 #define TASKMAP_MAX_RECORDS 32 -
boot/arch/ppc64/loader/ofwarch.c
reda7bf81 r63cda71 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 28 29 #include <ofwarch.h> 29 30 #include <ofw.h> 30 31 #include <printf.h> -
boot/arch/ppc64/loader/types.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef TYPES_H__30 #define TYPES_H__29 #ifndef BOOT_ppc64_TYPES_H_ 30 #define BOOT_ppc64_TYPES_H_ 31 31 32 32 #include <gentypes.h> -
boot/arch/sparc64/loader/Makefile
reda7bf81 r63cda71 53 53 ../../../generic/printf.c \ 54 54 ../../../genarch/ofw.c \ 55 ofw .c \55 ofwarch.c \ 56 56 asm.S \ 57 57 boot.S … … 65 65 .PHONY: all clean depend 66 66 67 all: image.boot 67 all: image.boot disasm 68 68 69 69 -include Makefile.depend … … 86 86 %.o: %.c 87 87 $(CC) $(DEFS) $(CFLAGS) -c $< -o $@ 88 89 disasm: image.boot 90 $(OBJDUMP) -d image.boot > boot.disasm -
boot/arch/sparc64/loader/asm.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef __ASM_H__30 #define __ASM_H__29 #ifndef BOOT_sparc64_ASM_H_ 30 #define BOOT_sparc64_ASM_H_ 31 31 32 32 #define PAGE_SIZE 8192 -
boot/arch/sparc64/loader/boot.S
reda7bf81 r63cda71 30 30 31 31 #define PSTATE_IE_BIT 2 32 #define PSTATE_AM_BIT 8 32 33 33 34 .register %g2, #scratch … … 56 57 57 58 /* 58 * Disable interrupts .59 * Disable interrupts and disable address masking. 59 60 */ 60 61 rdpr %pstate, %g2 61 and %g2, ~ PSTATE_IE_BIT, %g2 ! mask the Interrupt Enable bit62 and %g2, ~(PSTATE_IE_BIT|PSTATE_AM_BIT), %g2 62 63 wrpr %g2, 0, %pstate 63 64 … … 66 67 set ofw_cif, %l0 67 68 68 call init ! initialize OpenFirmware69 call ofw_init ! initialize OpenFirmware 69 70 stx %o4, [%l0] 70 71 -
boot/arch/sparc64/loader/main.c
reda7bf81 r63cda71 32 32 #include "_components.h" 33 33 #include <ofw.h> 34 #include <align.h> 34 35 35 36 #define KERNEL_VIRTUAL_ADDRESS 0x400000 … … 44 45 init_components(components); 45 46 47 if (!ofw_memmap(&bootinfo.memmap)) { 48 printf("Error: unable to get memory map, halting.\n"); 49 halt(); 50 } 51 52 if (bootinfo.memmap.total == 0) { 53 printf("Error: no memory detected, halting.\n"); 54 halt(); 55 } 56 57 if (!ofw_screen(&bootinfo.screen)) { 58 printf("Error: unable to get screen properties, halting.\n"); 59 halt(); 60 } 61 bootinfo.screen.addr = ofw_translate(bootinfo.screen.addr); 62 63 if (!ofw_keyboard(&bootinfo.keyboard)) { 64 printf("Error: unable to get keyboard properties, halting.\n"); 65 halt(); 66 } 67 68 printf("\nDevice statistics\n"); 69 printf(" memory: %dM\n", bootinfo.memmap.total>>20); 70 printf(" screen at %P, resolution %dx%d, %d bpp (scanline %d bytes)\n", (uintptr_t) bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.bpp, bootinfo.screen.scanline); 71 printf(" keyboard at %P (size %d bytes)\n", (uintptr_t) bootinfo.keyboard.addr, bootinfo.keyboard.size); 72 46 73 printf("\nMemory statistics\n"); 47 printf(" kernel entry point at % L\n", KERNEL_VIRTUAL_ADDRESS);48 printf(" % L: boot info structure\n", &bootinfo);74 printf(" kernel entry point at %P\n", KERNEL_VIRTUAL_ADDRESS); 75 printf(" %P: boot info structure\n", &bootinfo); 49 76 50 77 unsigned int i; 51 78 for (i = 0; i < COMPONENTS; i++) 52 printf(" % L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size);79 printf(" %P: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size); 53 80 54 81 printf("\nCopying components\n"); -
boot/arch/sparc64/loader/main.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef __MAIN_H__30 #define __MAIN_H__29 #ifndef BOOT_sparc64_MAIN_H_ 30 #define BOOT_sparc64_MAIN_H_ 31 31 32 /** Align to the nearest higher address. 33 * 34 * @param addr Address or size to be aligned. 35 * @param align Size of alignment, must be power of 2. 36 */ 37 #define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1)) 32 #include <ofw.h> 38 33 39 34 #define TASKMAP_MAX_RECORDS 32 … … 47 42 unsigned int cnt; 48 43 task_t tasks[TASKMAP_MAX_RECORDS]; 44 memmap_t memmap; 45 screen_t screen; 46 keyboard_t keyboard; 49 47 } bootinfo_t; 50 48 -
boot/arch/sparc64/loader/types.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef TYPES_H__30 #define TYPES_H__29 #ifndef BOOT_sparc64_TYPES_H_ 30 #define BOOT_sparc64_TYPES_H_ 31 31 32 32 #include <gentypes.h> -
boot/genarch/ofw.c
reda7bf81 r63cda71 27 27 */ 28 28 29 #include "ofw.h" 29 #include <ofw.h> 30 #include <ofwarch.h> 30 31 #include <printf.h> 31 32 #include <asm.h> … … 41 42 phandle ofw_aliases; 42 43 44 void ofw_init(void) 45 { 46 ofw_chosen = ofw_find_device("/chosen"); 47 if (ofw_chosen == -1) 48 halt(); 49 50 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) 51 ofw_stdout = 0; 52 53 ofw_root = ofw_find_device("/"); 54 if (ofw_root == -1) { 55 puts("\r\nError: Unable to find / device, halted.\r\n"); 56 halt(); 57 } 58 59 if (ofw_get_property(ofw_chosen, "mmu", &ofw_mmu, sizeof(ofw_mmu)) <= 0) { 60 puts("\r\nError: Unable to get mmu property, halted.\r\n"); 61 halt(); 62 } 63 64 ofw_memory = ofw_find_device("/memory"); 65 if (ofw_memory == -1) { 66 puts("\r\nError: Unable to find /memory device, halted.\r\n"); 67 halt(); 68 } 69 70 ofw_aliases = ofw_find_device("/aliases"); 71 if (ofw_aliases == -1) { 72 puts("\r\nError: Unable to find /aliases device, halted.\r\n"); 73 halt(); 74 } 75 } 76 77 43 78 static unsigned long ofw_call(const char *service, const int nargs, const int nret, ofw_arg_t *rets, ...) 44 79 { … … 80 115 81 116 82 staticunsigned int ofw_get_address_cells(const phandle device)83 { 84 unsigned int ret ;117 unsigned int ofw_get_address_cells(const phandle device) 118 { 119 unsigned int ret = 1; 85 120 86 121 if (ofw_get_property(device, "#address-cells", &ret, sizeof(ret)) <= 0) 87 122 if (ofw_get_property(ofw_root, "#address-cells", &ret, sizeof(ret)) <= 0) 88 ret = 1;123 ret = OFW_ADDRESS_CELLS; 89 124 90 125 return ret; … … 92 127 93 128 94 staticunsigned int ofw_get_size_cells(const phandle device)129 unsigned int ofw_get_size_cells(const phandle device) 95 130 { 96 131 unsigned int ret; … … 98 133 if (ofw_get_property(device, "#size-cells", &ret, sizeof(ret)) <= 0) 99 134 if (ofw_get_property(ofw_root, "#size-cells", &ret, sizeof(ret)) <= 0) 100 ret = 1;135 ret = OFW_SIZE_CELLS; 101 136 102 137 return ret; … … 107 142 { 108 143 return ofw_call("open", 1, 1, NULL, name); 109 }110 111 112 void init(void)113 {114 ofw_chosen = ofw_find_device("/chosen");115 if (ofw_chosen == -1)116 halt();117 118 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0)119 ofw_stdout = 0;120 121 ofw_root = ofw_find_device("/");122 if (ofw_root == -1) {123 puts("\r\nError: Unable to find / device, halted.\r\n");124 halt();125 }126 127 if (ofw_get_property(ofw_chosen, "mmu", &ofw_mmu, sizeof(ofw_mmu)) <= 0) {128 puts("\r\nError: Unable to get mmu property, halted.\r\n");129 halt();130 }131 132 ofw_memory = ofw_find_device("/memory");133 if (ofw_memory == -1) {134 puts("\r\nError: Unable to find /memory device, halted.\r\n");135 halt();136 }137 138 ofw_aliases = ofw_find_device("/aliases");139 if (ofw_aliases == -1) {140 puts("\r\nError: Unable to find /aliases device, halted.\r\n");141 halt();142 }143 144 } 144 145 … … 170 171 else 171 172 shift = 0; 172 173 173 174 return (void *) ((result[2]<<shift)|result[3]); 174 175 } … … 207 208 int ofw_memmap(memmap_t *map) 208 209 { 209 unsigned long buf[BUF_SIZE];210 int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf));211 if (ret <= 0)212 return false;213 214 210 unsigned int ac = ofw_get_address_cells(ofw_memory); 215 211 unsigned int sc = ofw_get_size_cells(ofw_memory); 216 212 213 uint32_t buf[((ac+sc)*MEMMAP_MAX_RECORDS)]; 214 int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf)); 215 if (ret <= 0) /* ret is the number of written bytes */ 216 return false; 217 217 218 int pos; 218 219 map->total = 0; 219 220 map->count = 0; 220 for (pos = 0; (pos < ret / sizeof(u nsigned long)) && (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) {221 void * start = (void *) buf[pos + ac - 1];221 for (pos = 0; (pos < ret / sizeof(uint32_t)) && (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) { 222 void * start = (void *) ((uintptr_t) buf[pos + ac - 1]); 222 223 unsigned int size = buf[pos + ac + sc - 1]; 223 224 … … 229 230 } 230 231 } 232 233 return true; 231 234 } 232 235 … … 235 238 { 236 239 char device_name[BUF_SIZE]; 240 uint32_t virtaddr; 237 241 238 242 if (ofw_get_property(ofw_aliases, "screen", device_name, sizeof(device_name)) <= 0) … … 243 247 return false; 244 248 245 if (ofw_get_property(device, "address", &screen->addr, sizeof(screen->addr)) <= 0) 246 return false; 247 249 if (ofw_get_property(device, "address", &virtaddr, sizeof(virtaddr)) <= 0) 250 return false; 251 252 screen->addr = (void *) ((uintptr_t) virtaddr); 253 248 254 if (ofw_get_property(device, "width", &screen->width, sizeof(screen->width)) <= 0) 249 255 return false; -
boot/genarch/ofw.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef __OFW_H__30 #define __OFW_H__29 #ifndef BOOT_OFW_H_ 30 #define BOOT_OFW_H_ 31 31 32 32 #include <types.h> … … 39 39 #define MAX_OFW_ARGS 12 40 40 41 typedef un signed longofw_arg_t;41 typedef unative_t ofw_arg_t; 42 42 typedef unsigned int ihandle; 43 43 typedef unsigned int phandle; … … 65 65 66 66 typedef struct { 67 uint32_taddr;67 void *addr; 68 68 unsigned int width; 69 69 unsigned int height; … … 73 73 74 74 typedef struct { 75 uint32_taddr;75 void *addr; 76 76 unsigned int size; 77 77 } keyboard_t; … … 93 93 extern phandle ofw_aliases; 94 94 95 extern void init(void);95 extern void ofw_init(void); 96 96 extern void ofw_write(const char *str, const int len); 97 97 … … 100 100 101 101 extern int ofw(ofw_args_t *arg); 102 extern unsigned int ofw_get_address_cells(const phandle device); 103 extern unsigned int ofw_get_size_cells(const phandle device); 102 104 extern void *ofw_translate(const void *virt); 103 105 extern int ofw_translate_failed(ofw_arg_t flag); -
boot/generic/gentypes.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef GENTYPES_H__30 #define GENTYPES_H__29 #ifndef BOOT_GENTYPES_H_ 30 #define BOOT_GENTYPES_H_ 31 31 32 32 #define NULL 0 -
boot/generic/printf.h
reda7bf81 r63cda71 27 27 */ 28 28 29 #ifndef PRINTF_H__30 #define PRINTF_H__29 #ifndef BOOT_PRINTF_H_ 30 #define BOOT_PRINTF_H_ 31 31 32 32 #define INT8 1 -
kernel/arch/sparc64/include/register.h
reda7bf81 r63cda71 36 36 #define KERN_sparc64_REGISTER_H_ 37 37 38 #ifdef __ASM__ 39 #define PSTATE_IE_BIT 2 40 #define PSTATE_AM_BIT 8 41 #else 42 38 #include <arch/regdef.h> 43 39 #include <arch/types.h> 44 40 … … 112 108 #endif 113 109 114 #endif115 116 110 /** @} 117 111 */ -
kernel/arch/sparc64/src/asm.S
reda7bf81 r63cda71 28 28 29 29 #include <arch/stack.h> 30 #include <arch/reg ister.h>30 #include <arch/regdef.h> 31 31 32 32 .text -
kernel/arch/sparc64/src/start.S
reda7bf81 r63cda71 28 28 29 29 #include <arch/boot/boot.h> 30 #include <arch/reg ister.h>30 #include <arch/regdef.h> 31 31 32 32 .register %g2, #scratch … … 38 38 39 39 /* 40 * Here is where the kernel is passed control. 40 * Here is where the kernel is passed control 41 * from the boot loader. 41 42 */ 42 43
Note:
See TracChangeset
for help on using the changeset viewer.