main.c revision 84617
1/*- 2 * Copyright (c) 2000 Benno Rice <benno@jeamland.net> 3 * Copyright (c) 2000 Stephane Potvin <sepotvin@videotron.ca> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $FreeBSD: head/sys/boot/ofw/common/main.c 84617 2001-10-07 13:22:25Z benno $ 28 */ 29 30#include <stand.h> 31#include "openfirm.h" 32#include "libofw.h" 33#include "bootstrap.h" 34 35struct ofw_devdesc currdev; /* our current device */ 36struct arch_switch archsw; /* MI/MD interface boundary */ 37 38extern char end[]; 39extern char bootprog_name[]; 40extern char bootprog_rev[]; 41extern char bootprog_date[]; 42extern char bootprog_maker[]; 43 44phandle_t chosen; 45 46#define HEAP_SIZE 0x40000 47 48void 49init_heap(void) 50{ 51 void *base; 52 53 if ((base = ofw_alloc_heap(HEAP_SIZE)) == (void *)0xffffffff) { 54 printf("Heap memory claim failed!\n"); 55 OF_enter(); 56 } 57 58 setheap(base, base + (HEAP_SIZE / sizeof(base))); 59} 60 61uint32_t 62memsize(void) 63{ 64 ihandle_t meminstance; 65 phandle_t memory; 66 struct ofw_reg reg; 67 68 OF_getprop(chosen, "memory", &meminstance, sizeof(meminstance)); 69 memory = OF_instance_to_package(meminstance); 70 71 OF_getprop(memory, "reg", ®, sizeof(reg)); 72 73 return (reg.size); 74} 75 76int 77main(int (*openfirm)(void *)) 78{ 79 int i; 80 char bootpath[64]; 81 char *ch; 82 83 /* 84 * Initalise the OpenFirmware routines by giving them the entry point. 85 */ 86 OF_init(openfirm); 87 88 chosen = OF_finddevice("/chosen"); 89 90 /* 91 * Set up console. 92 */ 93 cons_probe(); 94 95 /* 96 * Initialise the heap as early as possible. Once this is done, 97 * alloc() is usable. The stack is buried inside us, so this is 98 * safe. 99 */ 100 init_heap(); 101 102 /* 103 * Initialise the block cache 104 */ 105 bcache_init(32, 512); /* 16k XXX tune this */ 106 107 /* 108 * March through the device switch probing for things. 109 */ 110 for (i = 0; devsw[i] != NULL; i++) 111 if (devsw[i]->dv_init != NULL) 112 (devsw[i]->dv_init)(); 113 114 printf("\n"); 115 printf("%s, Revision %s\n", bootprog_name, bootprog_rev); 116 printf("(%s, %s)\n", bootprog_maker, bootprog_date); 117 printf("Memory: %dKB\n", memsize() / 1024); 118 119 OF_getprop(chosen, "bootpath", bootpath, 64); 120 ch = index(bootpath, ':'); 121 *ch = '\0'; 122 printf("Booted from: %s\n", bootpath); 123 124 printf("\n"); 125 126 switch (ofw_devicetype(bootpath)) { 127 case DEVT_DISK: 128 currdev.d_dev = &ofwdisk; 129 currdev.d_type = DEVT_DISK; 130 strncpy(currdev.d_kind.ofwdisk.path, bootpath, 64); 131 currdev.d_kind.ofwdisk.unit = ofwd_getunit(bootpath); 132 133 if (currdev.d_kind.ofwdisk.unit == -1) { 134 printf("Could not locate boot device.\n"); 135 OF_exit(); 136 } 137 138 break; 139 140 case DEVT_NET: 141 currdev.d_dev = &netdev; 142 currdev.d_type = DEVT_NET; 143 strncpy(currdev.d_kind.netif.path, bootpath, 64); 144 /* XXX Only works when we only look for one net device */ 145 currdev.d_kind.netif.unit = 0; 146 147 break; 148 149 case DEVT_NONE: 150 default: 151 printf("\n"); 152 printf("Could not establish type of boot device.\n"); 153 OF_exit(); 154 /* NOTREACHED */ 155 break; 156 } 157 158 env_setenv("currdev", EV_VOLATILE, ofw_fmtdev(&currdev), 159 ofw_setcurrdev, env_nounset); 160 env_setenv("loaddev", EV_VOLATILE, ofw_fmtdev(&currdev), env_noset, 161 env_nounset); 162 setenv("LINES", "24", 1); /* optional */ 163 164 archsw.arch_getdev = ofw_getdev; 165 archsw.arch_copyin = ofw_copyin; 166 archsw.arch_copyout = ofw_copyout; 167 archsw.arch_readin = ofw_readin; 168 archsw.arch_autoload = ofw_autoload; 169 170 interact(); /* doesn't return */ 171 172 OF_exit(); 173 174 return 0; 175} 176 177COMMAND_SET(halt, "halt", "halt the system", command_halt); 178 179static int 180command_halt(int argc, char *argv[]) 181{ 182 183 OF_exit(); 184 return (CMD_OK); 185} 186 187COMMAND_SET(memmap, "memmap", "print memory map", command_memmap); 188 189int 190command_memmap(int argc, char **argv) 191{ 192 193 ofw_memmap(); 194 return (CMD_OK); 195} 196