console.c revision 8012
18012Ssaidi@eecs.umich.edu/*
28012Ssaidi@eecs.umich.eduCopyright (c) 2003, 2004
38012Ssaidi@eecs.umich.eduThe Regents of The University of Michigan
48012Ssaidi@eecs.umich.eduAll Rights Reserved
57977Shsul@eecs.umich.edu
68012Ssaidi@eecs.umich.eduThis code is part of the M5 simulator, developed by Nathan Binkert,
78012Ssaidi@eecs.umich.eduErik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions
88012Ssaidi@eecs.umich.edufrom Ron Dreslinski, Dave Greene, Lisa Hsu, Ali Saidi, and Andrew
98012Ssaidi@eecs.umich.eduSchultz.
107977Shsul@eecs.umich.edu
118012Ssaidi@eecs.umich.eduPermission is granted to use, copy, create derivative works and
128012Ssaidi@eecs.umich.eduredistribute this software and such derivative works for any purpose,
138012Ssaidi@eecs.umich.eduso long as the copyright notice above, this grant of permission, and
148012Ssaidi@eecs.umich.eduthe disclaimer below appear in all copies made; and so long as the
158012Ssaidi@eecs.umich.eduname of The University of Michigan is not used in any advertising or
168012Ssaidi@eecs.umich.edupublicity pertaining to the use or distribution of this software
178012Ssaidi@eecs.umich.eduwithout specific, written prior authorization.
188012Ssaidi@eecs.umich.edu
198012Ssaidi@eecs.umich.eduTHIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE
208012Ssaidi@eecs.umich.eduUNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND WITHOUT
218012Ssaidi@eecs.umich.eduWARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER EXPRESS OR
228012Ssaidi@eecs.umich.eduIMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
238012Ssaidi@eecs.umich.eduMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE REGENTS OF
248012Ssaidi@eecs.umich.eduTHE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE FOR ANY DAMAGES,
258012Ssaidi@eecs.umich.eduINCLUDING DIRECT, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
268012Ssaidi@eecs.umich.eduDAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR IN CONNECTION
278012Ssaidi@eecs.umich.eduWITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR IS HEREAFTER
288012Ssaidi@eecs.umich.eduADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
298012Ssaidi@eecs.umich.edu*/
308012Ssaidi@eecs.umich.edu/*
318012Ssaidi@eecs.umich.eduCopyright 1993 Hewlett-Packard Development Company, L.P.
328012Ssaidi@eecs.umich.edu
338012Ssaidi@eecs.umich.eduPermission is hereby granted, free of charge, to any person obtaining a copy of
348012Ssaidi@eecs.umich.eduthis software and associated documentation files (the "Software"), to deal in
358012Ssaidi@eecs.umich.eduthe Software without restriction, including without limitation the rights to
368012Ssaidi@eecs.umich.eduuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
378012Ssaidi@eecs.umich.eduof the Software, and to permit persons to whom the Software is furnished to do
388012Ssaidi@eecs.umich.eduso, subject to the following conditions:
398012Ssaidi@eecs.umich.edu
408012Ssaidi@eecs.umich.eduThe above copyright notice and this permission notice shall be included in all
418012Ssaidi@eecs.umich.educopies or substantial portions of the Software.
428012Ssaidi@eecs.umich.edu
438012Ssaidi@eecs.umich.eduTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
448012Ssaidi@eecs.umich.eduIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
458012Ssaidi@eecs.umich.eduFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
468012Ssaidi@eecs.umich.eduAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
478012Ssaidi@eecs.umich.eduLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
488012Ssaidi@eecs.umich.eduOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
498012Ssaidi@eecs.umich.eduSOFTWARE.
508012Ssaidi@eecs.umich.edu*/
517977Shsul@eecs.umich.edu/* ******************************************
527977Shsul@eecs.umich.edu * SimOS SRM  Console
537977Shsul@eecs.umich.edu *
547977Shsul@eecs.umich.edu * Derived from Lance Berc's SRM console
557977Shsul@eecs.umich.edu * for the SRC XXM�Machine
567977Shsul@eecs.umich.edu * ******************************************/
577977Shsul@eecs.umich.edu
587977Shsul@eecs.umich.edu
597981Sbinkertn@umich.edutypedef unsigned long long uint64_t;
607977Shsul@eecs.umich.edutypedef unsigned long long uint64;
617981Sbinkertn@umich.edutypedef unsigned int uint32_t;
627978Sbinkertn@umich.edutypedef unsigned int uint32;
637978Sbinkertn@umich.edu
647978Sbinkertn@umich.edu#define CONSOLE
657978Sbinkertn@umich.edu#include "alpha_access.h"
667978Sbinkertn@umich.edu
677978Sbinkertn@umich.edu#if 0
687977Shsul@eecs.umich.edu#include "new_aouthdr.h"
697977Shsul@eecs.umich.edu#include "srcmax.h"
707977Shsul@eecs.umich.edu#endif
717977Shsul@eecs.umich.edu
727977Shsul@eecs.umich.edu/* from ../h */
737977Shsul@eecs.umich.edu#include "lib.h"
747977Shsul@eecs.umich.edu#include "rpb.h"
757977Shsul@eecs.umich.edu#include "cserve.h"
767977Shsul@eecs.umich.edu
777977Shsul@eecs.umich.edu#define CONS_INT_TX   0x01  /* interrupt enable / state bits */
787977Shsul@eecs.umich.edu#define CONS_INT_RX   0x02
797977Shsul@eecs.umich.edu
807977Shsul@eecs.umich.edu#define KSEG   0xfffffc0000000000
817977Shsul@eecs.umich.edu#define K1BASE 0xfffffc8000000000
827977Shsul@eecs.umich.edu#define KSEG_TO_PHYS(x)(((ul)x) & ~KSEG)
837977Shsul@eecs.umich.edu
848003Ssaidi@eecs.umich.edu#ifdef TSUNAMI
858003Ssaidi@eecs.umich.edu#define ALPHA_ACCESS_BASE 0xfffffd0200000000
868003Ssaidi@eecs.umich.edu#elif TLASER
877999Ssaidi@eecs.umich.edu#define ALPHA_ACCESS_BASE 0xfffffc8000a00000
888003Ssaidi@eecs.umich.edu#else
898003Ssaidi@eecs.umich.edu#error TSUNAMI/TLASER not defined.
908003Ssaidi@eecs.umich.edu#endif
917977Shsul@eecs.umich.edu
927977Shsul@eecs.umich.edu#define PHYS_TO_K1(_x) (K1BASE|(_x))
937977Shsul@eecs.umich.edu
947977Shsul@eecs.umich.edu#define AOUT_LOAD_ADDR (KSEG|0xf000)
957977Shsul@eecs.umich.edu
967977Shsul@eecs.umich.edu#define ROUNDUP8(x) ((ul)(((ul)x)+7) & ~7)
977977Shsul@eecs.umich.edu#define ROUNDUP128(x) ((ul)(((ul)x)+127) & ~127)
987977Shsul@eecs.umich.edu#define ROUNDUP8K(x) ((ul)(((ul)(x))+8191) & ~8191)
997977Shsul@eecs.umich.edu
1007977Shsul@eecs.umich.edu#define FIRST(x)  ((((ul)(x)) >> 33) & 0x3ff)
1017977Shsul@eecs.umich.edu#define SECOND(x) ((((ul)(x)) >> 23) & 0x3ff)
1027977Shsul@eecs.umich.edu#define THIRD(x) ((((ul)(x)) >> 13) & 0x3ff)
1037977Shsul@eecs.umich.edu#define THIRD_XXX(x)  ((((ul)(x)) >> 13) & 0xfff)
1047977Shsul@eecs.umich.edu#define PFN(x)  ((((ul)(x) & ~KSEG) >> 13))
1057977Shsul@eecs.umich.edu
1067977Shsul@eecs.umich.edu/* Kernel write | kernel read | valid */
1077977Shsul@eecs.umich.edu#define KPTE(x) ((ul)((((ul)(x)) << 32) | 0x1101))
1087977Shsul@eecs.umich.edu
1098010Ssaidi@eecs.umich.edu#define HWRPB_PAGES 16
1107977Shsul@eecs.umich.edu#define MDT_BITMAP_PAGES  4
1117977Shsul@eecs.umich.edu
1127977Shsul@eecs.umich.edu#define CSERVE_K_JTOKERN       0x18
1137977Shsul@eecs.umich.edu
1147977Shsul@eecs.umich.edu#define NUM_KERNEL_THIRD (4)
1157977Shsul@eecs.umich.edu
1168009Ssaidi@eecs.umich.edu#define printf_lock(args...)  \
1178009Ssaidi@eecs.umich.edu    do { \
1188009Ssaidi@eecs.umich.edu    SpinLock(&theLock); \
1198009Ssaidi@eecs.umich.edu    printf(args); \
1208009Ssaidi@eecs.umich.edu    SpinUnlock(&theLock); \
1218009Ssaidi@eecs.umich.edu    } while (0)
1228009Ssaidi@eecs.umich.edu
1237977Shsul@eecs.umich.edu
1247977Shsul@eecs.umich.edustatic unixBoot(int go, int argc, char **argv);
1257977Shsul@eecs.umich.eduvoid jToPal(ul bootadr);
1267977Shsul@eecs.umich.eduvoid SlaveLoop(int cpu);
1277977Shsul@eecs.umich.edu
1287977Shsul@eecs.umich.edu
1297978Sbinkertn@umich.edustruct AlphaAccess simosConf;
1307977Shsul@eecs.umich.edu
1317977Shsul@eecs.umich.edu/* **************************************************************
1327977Shsul@eecs.umich.edu * Console callbacks use VMS calling conventions
1337977Shsul@eecs.umich.edu * read AXP manual, 2-64.
1347977Shsul@eecs.umich.edu * ***************************************************************/
1357977Shsul@eecs.umich.edutypedef struct OpenVMSFunc {
1367977Shsul@eecs.umich.edu   long dummy;
1377977Shsul@eecs.umich.edu   long func;
1387977Shsul@eecs.umich.edu}OpenVMSFunc;
1397977Shsul@eecs.umich.edu
1407977Shsul@eecs.umich.eduOpenVMSFunc callbackFunc, fixupFunc;
1417977Shsul@eecs.umich.edu
1427977Shsul@eecs.umich.edu
1437977Shsul@eecs.umich.edu
1447977Shsul@eecs.umich.edu
1457977Shsul@eecs.umich.eduul theLock;
1467977Shsul@eecs.umich.edu
1477977Shsul@eecs.umich.edu
1487977Shsul@eecs.umich.eduextern void SpinLock(ul *lock);
1497977Shsul@eecs.umich.edu#define SpinUnlock(_x) *(_x) = 0;
1507977Shsul@eecs.umich.edu
1517977Shsul@eecs.umich.edustruct _kernel_params {
1527977Shsul@eecs.umich.edu   char *bootadr;
1537977Shsul@eecs.umich.edu   ul rpb_percpu;
1547977Shsul@eecs.umich.edu   ul free_pfn;
1557977Shsul@eecs.umich.edu   ul argc;
1567977Shsul@eecs.umich.edu   ul argv;
1577977Shsul@eecs.umich.edu   ul envp; /* NULL */
1587977Shsul@eecs.umich.edu};
1597977Shsul@eecs.umich.edu
1607977Shsul@eecs.umich.edu
1617977Shsul@eecs.umich.eduextern consoleCallback[];
1627977Shsul@eecs.umich.eduextern consoleFixup[];
1637977Shsul@eecs.umich.edulong CallBackDispatcher();
1647977Shsul@eecs.umich.edulong CallBackFixup();
1657977Shsul@eecs.umich.edu
1667977Shsul@eecs.umich.edu/*
1677977Shsul@eecs.umich.edu * simos console output
1687977Shsul@eecs.umich.edu */
1697977Shsul@eecs.umich.edu
1707977Shsul@eecs.umich.eduvoid InitConsole(void)
1717977Shsul@eecs.umich.edu{
1727977Shsul@eecs.umich.edu#if 0
1737977Shsul@eecs.umich.edu   CDR->intr_status =(DevRegister)(DEV_CNSLE_RX_INTR |DEV_CNSLE_TX_INTR);
1747977Shsul@eecs.umich.edu#endif
1757977Shsul@eecs.umich.edu}
1767977Shsul@eecs.umich.edu
1777978Sbinkertn@umich.educhar GetChar()
1787978Sbinkertn@umich.edu{
1797999Ssaidi@eecs.umich.edu   struct AlphaAccess *k1Conf = (struct AlphaAccess *)(ALPHA_ACCESS_BASE);
1807981Sbinkertn@umich.edu   return k1Conf->inputChar;
1817978Sbinkertn@umich.edu}
1827978Sbinkertn@umich.edu
1837977Shsul@eecs.umich.eduvoid PutChar(char c)
1847977Shsul@eecs.umich.edu{
1857977Shsul@eecs.umich.edu#if 0
1867977Shsul@eecs.umich.edu   CDR->data = c;
1877977Shsul@eecs.umich.edu#endif
1887977Shsul@eecs.umich.edu#if 0
1897977Shsul@eecs.umich.edu   *(int*) PHYS_TO_K1(SLOT_D_COM1<<5) = c;
1907977Shsul@eecs.umich.edu#endif
1917999Ssaidi@eecs.umich.edu   struct AlphaAccess *k1Conf = (struct AlphaAccess *)(ALPHA_ACCESS_BASE);
1927977Shsul@eecs.umich.edu   k1Conf->outputChar = c;
1937977Shsul@eecs.umich.edu
1947977Shsul@eecs.umich.edu}
1957977Shsul@eecs.umich.edu
1967977Shsul@eecs.umich.edu
1977978Sbinkertn@umich.eduint
1987978Sbinkertn@umich.edupassArgs(int argc)
1997978Sbinkertn@umich.edu{ return 0; }
2007977Shsul@eecs.umich.edu
2017978Sbinkertn@umich.eduint
2027977Shsul@eecs.umich.edumain(int argc, char **argv)
2037977Shsul@eecs.umich.edu{
2047977Shsul@eecs.umich.edu   int x,i;
2057999Ssaidi@eecs.umich.edu   struct AlphaAccess *k1Conf = (struct AlphaAccess *)(ALPHA_ACCESS_BASE);
2067977Shsul@eecs.umich.edu   ui *k1ptr,*ksegptr;
2077977Shsul@eecs.umich.edu
2087977Shsul@eecs.umich.edu
2097977Shsul@eecs.umich.edu   InitConsole();
2108009Ssaidi@eecs.umich.edu   printf_lock("M5 console\n");
2117977Shsul@eecs.umich.edu   /*
2127977Shsul@eecs.umich.edu    * get configuration from backdoor
2137977Shsul@eecs.umich.edu    */
2147977Shsul@eecs.umich.edu   simosConf.last_offset = k1Conf->last_offset;
2158009Ssaidi@eecs.umich.edu   printf_lock("Got Configuration %d \n",simosConf.last_offset);
2168001Ssaidi@eecs.umich.edu
2178001Ssaidi@eecs.umich.edu    simosConf.last_offset = k1Conf->last_offset;
2188001Ssaidi@eecs.umich.edu    simosConf.version = k1Conf->version;
2198001Ssaidi@eecs.umich.edu    simosConf.numCPUs = k1Conf->numCPUs;
2208001Ssaidi@eecs.umich.edu    simosConf.intrClockFrequency = k1Conf->intrClockFrequency;
2218001Ssaidi@eecs.umich.edu    simosConf.cpuClock = k1Conf->cpuClock;
2228001Ssaidi@eecs.umich.edu    simosConf.mem_size = k1Conf->mem_size;
2238001Ssaidi@eecs.umich.edu    simosConf.kernStart = k1Conf->kernStart;
2248001Ssaidi@eecs.umich.edu    simosConf.kernEnd = k1Conf->kernEnd;
2258001Ssaidi@eecs.umich.edu    simosConf.entryPoint = k1Conf->entryPoint;
2268001Ssaidi@eecs.umich.edu    simosConf.diskUnit = k1Conf->diskUnit;
2278001Ssaidi@eecs.umich.edu    simosConf.diskCount = k1Conf->diskCount;
2288001Ssaidi@eecs.umich.edu    simosConf.diskPAddr = k1Conf->diskPAddr;
2298001Ssaidi@eecs.umich.edu    simosConf.diskBlock = k1Conf->diskBlock;
2308001Ssaidi@eecs.umich.edu    simosConf.diskOperation = k1Conf->diskOperation;
2318001Ssaidi@eecs.umich.edu    simosConf.outputChar = k1Conf->outputChar;
2328001Ssaidi@eecs.umich.edu    simosConf.inputChar = k1Conf->inputChar;
2338001Ssaidi@eecs.umich.edu    simosConf.bootStrapImpure = k1Conf->bootStrapImpure;
2348001Ssaidi@eecs.umich.edu    simosConf.bootStrapCPU = k1Conf->bootStrapCPU;
2357977Shsul@eecs.umich.edu
2367977Shsul@eecs.umich.edu   if (simosConf.version != ALPHA_ACCESS_VERSION)  {
2378004Ssaidi@eecs.umich.edu      panic("Console version mismatch. Console expects %d. has %d \n",
2387977Shsul@eecs.umich.edu            ALPHA_ACCESS_VERSION,simosConf.version);
2397977Shsul@eecs.umich.edu   }
2407977Shsul@eecs.umich.edu
2417977Shsul@eecs.umich.edu
2427977Shsul@eecs.umich.edu   /*
2437977Shsul@eecs.umich.edu    * setup arguments to kernel
2447977Shsul@eecs.umich.edu    */
2457977Shsul@eecs.umich.edu   unixBoot(1,argc,argv);
2467977Shsul@eecs.umich.edu
2477977Shsul@eecs.umich.edu   x = *(volatile int *)(K1BASE-4);
2487977Shsul@eecs.umich.edu   while(1) continue;
2497977Shsul@eecs.umich.edu   return x;
2507977Shsul@eecs.umich.edu}
2517977Shsul@eecs.umich.edu
2527977Shsul@eecs.umich.edu/*
2537977Shsul@eecs.umich.edu * BOOTING
2547977Shsul@eecs.umich.edu */
2557977Shsul@eecs.umich.edustruct rpb xxm_rpb = {
2567977Shsul@eecs.umich.edu   NULL,		/* 000: physical self-reference */
2577978Sbinkertn@umich.edu   ((long)'H') | (((long)'W') << 8) | (((long)'R') << 16) |
2587978Sbinkertn@umich.edu   ((long)'P' << 24) | (((long)'B') << 32),  /* 008: contains string "HWRPB" */
2597977Shsul@eecs.umich.edu   6,			/* 010: HWRPB version number */
2607977Shsul@eecs.umich.edu   /* the byte count is wrong, but who needs it? - lance */
2617977Shsul@eecs.umich.edu   0,			/* 018: bytes in RPB perCPU CTB CRB MEDSC */
2627977Shsul@eecs.umich.edu   0,			/* 020: primary cpu id */
2637977Shsul@eecs.umich.edu   8192,		/* 028: page size in bytes */
2647977Shsul@eecs.umich.edu   43,		/* 030: number of phys addr bits */
2657977Shsul@eecs.umich.edu   127,		/* 038: max valid ASN */
2667977Shsul@eecs.umich.edu   {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1'},	/* 040: system serial num: 10 ascii chars */
2677977Shsul@eecs.umich.edu#ifdef undef
2687977Shsul@eecs.umich.edu/* To be legitimate, the following system type and variation are correct for the XXM.
2697977Shsul@eecs.umich.edu   But there are too many #ifdefs etc to deal with in Unix, so we tell the kernel
2707977Shsul@eecs.umich.edu   that we're an Avanti, which is similar enough.
2717977Shsul@eecs.umich.edu   */
2727977Shsul@eecs.umich.edu   31,		/* 050: system type - XXM is now in the Alpha SRM */
2737977Shsul@eecs.umich.edu   (1 << 10) | (2<<1),/* 058: system variation - XXM w/EV5 & embeded console */
2747977Shsul@eecs.umich.edu#endif
2757977Shsul@eecs.umich.edu#if 0
2767977Shsul@eecs.umich.edu   0x12,		/* 050: system type - masquarade as some random 21064 */
2777977Shsul@eecs.umich.edu#endif
2788004Ssaidi@eecs.umich.edu   0, /* OVERRIDDEN */
2798004Ssaidi@eecs.umich.edu   (1<<10),		/* 058: system variation OVERRIDDEN */
2807977Shsul@eecs.umich.edu   'c'|('o'<<8)|('o'<<16)|('l'<< 24),		/* 060: system revision */
2817977Shsul@eecs.umich.edu   1024*4096,		/* 068: scaled interval clock intr freq  OVERRIDEN*/
2827977Shsul@eecs.umich.edu   0,			/* 070: cycle counter frequency */
2837977Shsul@eecs.umich.edu   0x200000000,	/* 078: virtual page table base */
2847977Shsul@eecs.umich.edu   0,			/* 080: reserved */
2857977Shsul@eecs.umich.edu   0,			/* 088: offset to translation buffer hint */
2867977Shsul@eecs.umich.edu   1,			/* 090: number of processor slots OVERRIDDEN*/
2877977Shsul@eecs.umich.edu   sizeof(struct rpb_percpu),	/* 098: per-cpu slot size. OVERRIDDEN */
2887977Shsul@eecs.umich.edu   0,			/* 0A0: offset to per_cpu slots */
2897977Shsul@eecs.umich.edu   1,			/* 0A8: number of CTBs */
2907977Shsul@eecs.umich.edu#ifdef bugnion_gone
2917977Shsul@eecs.umich.edu   sizeof(struct rpb_ctb),	/* 0B0: bytes in largest CTB */
2927977Shsul@eecs.umich.edu#else
2937977Shsul@eecs.umich.edu   sizeof(struct ctb_tt),
2947977Shsul@eecs.umich.edu#endif
2957977Shsul@eecs.umich.edu   0,			/* 0B8: offset to CTB (cons term block) */
2967977Shsul@eecs.umich.edu   0,			/* 0C0: offset to CRB (cons routine block) */
2977977Shsul@eecs.umich.edu   0,			/* 0C8: offset to memory descriptor table */
2987977Shsul@eecs.umich.edu   0,			/* 0D0: offset to config data block */
2997977Shsul@eecs.umich.edu   0,			/* 0D8: offset to FRU table */
3007977Shsul@eecs.umich.edu   0,			/* 0E0: virt addr of save term routine */
3017977Shsul@eecs.umich.edu   0,			/* 0E8: proc value for save term routine */
3027977Shsul@eecs.umich.edu   0,			/* 0F0: virt addr of restore term routine */
3037977Shsul@eecs.umich.edu   0,			/* 0F8: proc value for restore term routine */
3047977Shsul@eecs.umich.edu   0,			/* 100: virt addr of CPU restart routine */
3057977Shsul@eecs.umich.edu   0,			/* 108: proc value for CPU restart routine */
3067977Shsul@eecs.umich.edu   0,			/* 110: used to determine presence of kdebug */
3077977Shsul@eecs.umich.edu   0,			/* 118: reserved for hardware */
3087977Shsul@eecs.umich.edu/* the checksum is wrong, but who needs it? - lance */
3097977Shsul@eecs.umich.edu   0,			/* 120: checksum of prior entries in rpb */
3107977Shsul@eecs.umich.edu   0,			/* 128: receive ready bitmask */
3117977Shsul@eecs.umich.edu   0,			/* 130: transmit ready bitmask */
3127977Shsul@eecs.umich.edu   0,			/* 138: Dynamic System Recog. offset */
3137977Shsul@eecs.umich.edu};
3147977Shsul@eecs.umich.edu
3157977Shsul@eecs.umich.eduul xxm_tbb[] = { 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e,
3167977Shsul@eecs.umich.edu                 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e};
3177977Shsul@eecs.umich.edu
3187977Shsul@eecs.umich.edustruct rpb_percpu xxm_rpb_percpu = {
3198004Ssaidi@eecs.umich.edu   {0,0,0,0,0,0,1,{0,0},{0,0,0,0,0,0,0,0}},				/* 000: boot/restart HWPCB */
3207977Shsul@eecs.umich.edu   (STATE_PA | STATE_PP | STATE_CV | STATE_PV | STATE_PMV | STATE_PL), 	/* 080: per-cpu state bits */
3217977Shsul@eecs.umich.edu   0xc000,				/* 088: palcode memory length */
3227977Shsul@eecs.umich.edu   0x2000,				/* 090: palcode scratch length */
3237977Shsul@eecs.umich.edu   0x4000,				/* 098: phys addr of palcode mem space */
3247977Shsul@eecs.umich.edu   0x2000,				/* 0A0: phys addr of palcode scratch space */
3257977Shsul@eecs.umich.edu   (2 << 16) | (5 << 8) | 1,		/* 0A8: PALcode rev required */
3268004Ssaidi@eecs.umich.edu   11 | (2L  << 32),				/* 0B0: processor type */
3277977Shsul@eecs.umich.edu   7,					/* 0B8: processor variation */
3288004Ssaidi@eecs.umich.edu   'M'|('5'<<8)|('A'<<16)|('0'<<24),	/* 0C0: processor revision */
3298004Ssaidi@eecs.umich.edu   {'M','5','/','A','l','p','h','a','0','0','0','0','0','0','0','0'},	/* 0C8: proc serial num: 10 ascii chars */
3307977Shsul@eecs.umich.edu   0,					/* 0D8: phys addr of logout area */
3317977Shsul@eecs.umich.edu   0,					/* 0E0: length in bytes of logout area */
3327977Shsul@eecs.umich.edu   0,					/* 0E8: halt pcb base */
3337977Shsul@eecs.umich.edu   0,					/* 0F0: halt pc */
3347977Shsul@eecs.umich.edu   0,					/* 0F8: halt ps */
3357977Shsul@eecs.umich.edu   0,					/* 100: halt arg list (R25) */
3367977Shsul@eecs.umich.edu   0,					/* 108: halt return address (R26) */
3377977Shsul@eecs.umich.edu   0,					/* 110: halt procedure value (R27) */
3387977Shsul@eecs.umich.edu   0,		       			/* 118: reason for halt */
3397977Shsul@eecs.umich.edu   0,		       			/* 120: for software */
3407977Shsul@eecs.umich.edu   {0},				/* 128: inter-console communications buffer */
3417977Shsul@eecs.umich.edu   {1,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0},	/* 1D0: PALcode revs available */
3427977Shsul@eecs.umich.edu   0					/* 250: reserved for arch use */
3437977Shsul@eecs.umich.edu/* the dump stack grows from the end of the rpb page not to reach here */
3447977Shsul@eecs.umich.edu};
3457977Shsul@eecs.umich.edu
3467977Shsul@eecs.umich.edustruct _xxm_rpb_mdt {
3477977Shsul@eecs.umich.edu   long   rpb_checksum;	/* 000: checksum of entire mem desc table */
3487977Shsul@eecs.umich.edu   long   rpb_impaddr;		/* 008: PA of implementation dep info */
3497977Shsul@eecs.umich.edu   long   rpb_numcl;		/* 010: number of clusters */
3507977Shsul@eecs.umich.edu   struct rpb_cluster rpb_cluster[3];	/* first instance of a cluster */
3517977Shsul@eecs.umich.edu};
3527977Shsul@eecs.umich.edu
3537977Shsul@eecs.umich.edustruct _xxm_rpb_mdt xxm_rpb_mdt = {
3547977Shsul@eecs.umich.edu   0,		/* 000: checksum of entire mem desc table */
3557977Shsul@eecs.umich.edu   0,		/* 008: PA of implementation dep info */
3567977Shsul@eecs.umich.edu   0,		/* 010: number of clusters */
3577977Shsul@eecs.umich.edu   {{	0,		/* 000: starting PFN of this cluster */
3587977Shsul@eecs.umich.edu        0,		/* 008: count of PFNs in this cluster */
3597977Shsul@eecs.umich.edu        0,		/* 010: count of tested PFNs in cluster */
3607977Shsul@eecs.umich.edu        0,		/* 018: va of bitmap */
3617977Shsul@eecs.umich.edu        0,		/* 020: pa of bitmap */
3627977Shsul@eecs.umich.edu        0,		/* 028: checksum of bitmap */
3637977Shsul@eecs.umich.edu        1		/* 030: usage of cluster */
3647977Shsul@eecs.umich.edu   },
3657977Shsul@eecs.umich.edu    {   0,		/* 000: starting PFN of this cluster */
3667977Shsul@eecs.umich.edu        0,		/* 008: count of PFNs in this cluster */
3677977Shsul@eecs.umich.edu        0,		/* 010: count of tested PFNs in cluster */
3687977Shsul@eecs.umich.edu        0,		/* 018: va of bitmap */
3697977Shsul@eecs.umich.edu        0,		/* 020: pa of bitmap */
3707977Shsul@eecs.umich.edu        0,		/* 028: checksum of bitmap */
3717977Shsul@eecs.umich.edu        0		/* 030: usage of cluster */
3727977Shsul@eecs.umich.edu    },
3737977Shsul@eecs.umich.edu    {   0,		/* 000: starting PFN of this cluster */
3747977Shsul@eecs.umich.edu        0,		/* 008: count of PFNs in this cluster */
3757977Shsul@eecs.umich.edu        0,		/* 010: count of tested PFNs in cluster */
3767977Shsul@eecs.umich.edu        0,		/* 018: va of bitmap */
3777977Shsul@eecs.umich.edu        0,		/* 020: pa of bitmap */
3787977Shsul@eecs.umich.edu        0,		/* 028: checksum of bitmap */
3797977Shsul@eecs.umich.edu        0		/* 030: usage of cluster */
3807977Shsul@eecs.umich.edu    }}
3817977Shsul@eecs.umich.edu};
3827977Shsul@eecs.umich.edu
3837977Shsul@eecs.umich.edu/* constants for slotinfo bus_type subfield */
3847977Shsul@eecs.umich.edu#define SLOTINFO_TC	0
3857977Shsul@eecs.umich.edu#define SLOTINFO_ISA	1
3867977Shsul@eecs.umich.edu#define SLOTINFO_EISA	2
3877977Shsul@eecs.umich.edu#define SLOTINFO_PCI	3
3887977Shsul@eecs.umich.edu
3897977Shsul@eecs.umich.edustruct rpb_ctb xxm_rpb_ctb = {
3907977Shsul@eecs.umich.edu   CONS_DZ,	/* 000: console type */
3917977Shsul@eecs.umich.edu   0,		/* 008: console unit */
3927977Shsul@eecs.umich.edu   0,		/* 010: reserved */
3937977Shsul@eecs.umich.edu   0		/* 018: byte length of device dep portion */
3947977Shsul@eecs.umich.edu};
3957977Shsul@eecs.umich.edu
3967977Shsul@eecs.umich.edu/* we don't do any fixup (aka relocate the console) - we hope */
3977977Shsul@eecs.umich.edustruct rpb_crb xxm_rpb_crb = {
3987977Shsul@eecs.umich.edu   0,		/* va of call-back dispatch rtn */
3997977Shsul@eecs.umich.edu   0,		/* pa of call-back dispatch rtn */
4007977Shsul@eecs.umich.edu   0,		/* va of call-back fixup rtn */
4017977Shsul@eecs.umich.edu   0,		/* pa of call-back fixup rtn */
4027977Shsul@eecs.umich.edu   0,		/* number of entries in phys/virt map */
4037977Shsul@eecs.umich.edu   0		/* Number of pages to be mapped */
4047977Shsul@eecs.umich.edu};
4057977Shsul@eecs.umich.edu
4067977Shsul@eecs.umich.edustruct _rpb_name {
4077977Shsul@eecs.umich.edu   unsigned long length;
4087977Shsul@eecs.umich.edu   char name[16];
4097977Shsul@eecs.umich.edu};
4107977Shsul@eecs.umich.edu
4117977Shsul@eecs.umich.eduextern struct _rpb_name xxm_name;
4127977Shsul@eecs.umich.edu
4137977Shsul@eecs.umich.edustruct rpb_dsr xxm_rpb_dsr = {
4147977Shsul@eecs.umich.edu   0,
4157977Shsul@eecs.umich.edu   0,
4167977Shsul@eecs.umich.edu   0,
4177977Shsul@eecs.umich.edu};
4187977Shsul@eecs.umich.edu
4197977Shsul@eecs.umich.edustruct _rpb_name xxm_name = {
4207977Shsul@eecs.umich.edu   16,
4217977Shsul@eecs.umich.edu   {'D','E','C',' ','S','R','C',' ','X','X','M',' ','D','G','C',0},
4227977Shsul@eecs.umich.edu};
4237977Shsul@eecs.umich.edu
4247977Shsul@eecs.umich.edu/* XXM has one LURT entry - 1050 is for workstations, 1100 is servers (and is needed for CXX) */
4257977Shsul@eecs.umich.edulong xxm_lurt[10] = { 9, 12, -1, -1, -1, -1, -1, -1, 1100, 1100 };
4267977Shsul@eecs.umich.edu
4277977Shsul@eecs.umich.eduul unix_boot_mem;
4287977Shsul@eecs.umich.eduunsigned long bootadr;
4297977Shsul@eecs.umich.edu#if 0
4307977Shsul@eecs.umich.eduunsigned long  aout_bss_addr, aout_bss_size, aout_entry, aout_text_start, aout_data_addr;
4317977Shsul@eecs.umich.edu#endif
4327977Shsul@eecs.umich.educhar **kargv;
4337977Shsul@eecs.umich.eduint kargc;
4347977Shsul@eecs.umich.eduul free_pfn;
4357977Shsul@eecs.umich.edustruct rpb_percpu *rpb_percpu;
4367977Shsul@eecs.umich.edu
4377977Shsul@eecs.umich.edu
4387977Shsul@eecs.umich.edu#define MAX_CPUS 32
4397977Shsul@eecs.umich.edu
4407977Shsul@eecs.umich.eduul bootStrapImpure[MAX_CPUS];
4417977Shsul@eecs.umich.edu
4427977Shsul@eecs.umich.edu
4437977Shsul@eecs.umich.educhar *unix_boot_alloc(int pages)
4447977Shsul@eecs.umich.edu{
4457977Shsul@eecs.umich.edu   char *ret = (char *) unix_boot_mem;
4467977Shsul@eecs.umich.edu   unix_boot_mem += (pages * 8192);
4477977Shsul@eecs.umich.edu   return ret;
4487977Shsul@eecs.umich.edu}
4497977Shsul@eecs.umich.edu
4507977Shsul@eecs.umich.eduul *first = 0;
4517977Shsul@eecs.umich.eduul *third_rpb = 0;
4527977Shsul@eecs.umich.eduul *reservedFixup = 0;
4537977Shsul@eecs.umich.edu
4547978Sbinkertn@umich.eduint strcpy(char *dst, char *src);
4557978Sbinkertn@umich.edu
4567977Shsul@eecs.umich.edustruct rpb *rpb;
4577977Shsul@eecs.umich.edu
4587977Shsul@eecs.umich.eduunixBoot(int go, int argc, char **argv)
4597977Shsul@eecs.umich.edu{
4607977Shsul@eecs.umich.edu   ul *second,  *third_kernel, ptr, *tbb, size, *percpu_logout;
4617977Shsul@eecs.umich.edu   unsigned char *mdt_bitmap;
4627977Shsul@eecs.umich.edu   long *lp1, *lp2, sum;
4637977Shsul@eecs.umich.edu   int i, cl;
4647977Shsul@eecs.umich.edu   int kern_first_page;
4657977Shsul@eecs.umich.edu   int mem_size = simosConf.mem_size;
4667977Shsul@eecs.umich.edu
4677977Shsul@eecs.umich.edu   int mem_pages = mem_size / 8192, cons_pages;
4687977Shsul@eecs.umich.edu   ul kernel_bytes, ksp, kernel_end, *unix_kernel_stack, bss, ksp_bottom, ksp_top;
4697977Shsul@eecs.umich.edu   struct rpb_ctb *rpb_ctb;
4707977Shsul@eecs.umich.edu   struct ctb_tt *ctb_tt;
4717977Shsul@eecs.umich.edu   struct rpb_dsr *rpb_dsr;
4727977Shsul@eecs.umich.edu   struct rpb_crb *rpb_crb;
4737977Shsul@eecs.umich.edu   struct _xxm_rpb_mdt *rpb_mdt;
4747977Shsul@eecs.umich.edu   int *rpb_lurt;
4757977Shsul@eecs.umich.edu   char *rpb_name;
4767977Shsul@eecs.umich.edu   ul nextPtr;
4777977Shsul@eecs.umich.edu
4788009Ssaidi@eecs.umich.edu   printf_lock( "memsize %x pages %x \n",mem_size,mem_pages);
4797977Shsul@eecs.umich.edu
4807977Shsul@eecs.umich.edu
4817977Shsul@eecs.umich.edu
4827977Shsul@eecs.umich.edu#ifdef notnow
4837977Shsul@eecs.umich.edu   if (unixArgs()) return;
4847977Shsul@eecs.umich.edu#endif
4857977Shsul@eecs.umich.edu
4867977Shsul@eecs.umich.edu   /* Allocate:
4877977Shsul@eecs.umich.edu    *   two pages for the HWRPB
4887977Shsul@eecs.umich.edu    *   five page table pages:
4897977Shsul@eecs.umich.edu    *     1: First level page table
4907977Shsul@eecs.umich.edu    *     1: Second level page table
4917977Shsul@eecs.umich.edu    *     1: Third level page table for HWRPB
4927977Shsul@eecs.umich.edu    *     2: Third level page table for kernel (for up to 16MB)
4937977Shsul@eecs.umich.edu    * set up the page tables
4947977Shsul@eecs.umich.edu    * load the kernel at the physical address 0x230000
4957977Shsul@eecs.umich.edu    * build the HWRPB
4967977Shsul@eecs.umich.edu    *   set up memory descriptor table to give up the
4977977Shsul@eecs.umich.edu    *   physical memory between the end of the page
4987977Shsul@eecs.umich.edu    *   tables and the start of the kernel
4997977Shsul@eecs.umich.edu    * enable kseg addressing
5007977Shsul@eecs.umich.edu    * jump to the kernel
5017977Shsul@eecs.umich.edu    */
5027977Shsul@eecs.umich.edu
5037977Shsul@eecs.umich.edu   unix_boot_mem = ROUNDUP8K(&_end);
5047977Shsul@eecs.umich.edu
5058009Ssaidi@eecs.umich.edu   printf_lock("First free page after ROM 0x%x\n", unix_boot_mem);
5067977Shsul@eecs.umich.edu
5077977Shsul@eecs.umich.edu   rpb = (struct rpb *) unix_boot_alloc( HWRPB_PAGES);
5087977Shsul@eecs.umich.edu
5097977Shsul@eecs.umich.edu   mdt_bitmap =  (unsigned char *) unix_boot_alloc(MDT_BITMAP_PAGES);
5107977Shsul@eecs.umich.edu   first = (ul *)unix_boot_alloc(1);
5117977Shsul@eecs.umich.edu   second = (ul *)unix_boot_alloc(1);
5127977Shsul@eecs.umich.edu   third_rpb = (ul *)unix_boot_alloc(1);
5137977Shsul@eecs.umich.edu   reservedFixup = (ul*) unix_boot_alloc(1);
5147977Shsul@eecs.umich.edu   third_kernel = (ul *)unix_boot_alloc(NUM_KERNEL_THIRD);
5157977Shsul@eecs.umich.edu   percpu_logout = (ul*)unix_boot_alloc(1);
5167977Shsul@eecs.umich.edu
5177977Shsul@eecs.umich.edu
5187977Shsul@eecs.umich.edu   cons_pages = KSEG_TO_PHYS(unix_boot_mem) / 8192;
5197977Shsul@eecs.umich.edu
5207977Shsul@eecs.umich.edu   /* Set up the page tables */
5217977Shsul@eecs.umich.edu   bzero((char *)first, 8192);
5227977Shsul@eecs.umich.edu   bzero((char *)second, 8192);
5237977Shsul@eecs.umich.edu   bzero((char *)reservedFixup,8192);
5247977Shsul@eecs.umich.edu   bzero((char *)third_rpb, HWRPB_PAGES * 8192);
5257977Shsul@eecs.umich.edu   bzero((char *)third_kernel, 8192 * NUM_KERNEL_THIRD);
5267977Shsul@eecs.umich.edu
5277977Shsul@eecs.umich.edu   first[0] = KPTE(PFN(second));
5287977Shsul@eecs.umich.edu   first[1] = KPTE(PFN(first)); /* Region 3 */
5297977Shsul@eecs.umich.edu
5307977Shsul@eecs.umich.edu   second[SECOND(0x10000000)] = KPTE(PFN(third_rpb));	/* Region 0 */
5318010Ssaidi@eecs.umich.edu
5327977Shsul@eecs.umich.edu   for (i=0;i<NUM_KERNEL_THIRD;i++) {
5337977Shsul@eecs.umich.edu      second[SECOND(0x20000000)+i] = KPTE(PFN(third_kernel)+i);	/* Region 1 */
5347977Shsul@eecs.umich.edu   }
5357977Shsul@eecs.umich.edu   second[SECOND(0x40000000)] = KPTE(PFN(second));	/* Region 2 */
5367977Shsul@eecs.umich.edu
5377977Shsul@eecs.umich.edu
5387977Shsul@eecs.umich.edu   {
5397977Shsul@eecs.umich.edu
5407977Shsul@eecs.umich.edu      /* For some obscure reason, Dec Unix's database read
5417977Shsul@eecs.umich.edu       * from /etc/sysconfigtab is written to this fixed
5427977Shsul@eecs.umich.edu       * mapped memory location. Go figure, since it is
5437977Shsul@eecs.umich.edu       * not initialized by the console. Maybe it is
5447977Shsul@eecs.umich.edu       * to look at the database from the console
5457977Shsul@eecs.umich.edu       * after a boot/crash.
5467977Shsul@eecs.umich.edu       *
5477977Shsul@eecs.umich.edu       * Black magic to estimate the max size. SEGVs on overflow
5487977Shsul@eecs.umich.edu       * bugnion
5497977Shsul@eecs.umich.edu       */
5507977Shsul@eecs.umich.edu
5517977Shsul@eecs.umich.edu#define DATABASE_BASE           0x20000000
5527977Shsul@eecs.umich.edu#ifdef not_not
5537977Shsul@eecs.umich.edu#define DATABASE_END            0x20230000 /* don't need all that */
5547977Shsul@eecs.umich.edu#endif
5557977Shsul@eecs.umich.edu
5567977Shsul@eecs.umich.edu#define DATABASE_END            0x20020000
5577977Shsul@eecs.umich.edu
5587977Shsul@eecs.umich.edu      int i;
5597977Shsul@eecs.umich.edu      ul *dbPage = (ul*)unix_boot_alloc(1);
5607977Shsul@eecs.umich.edu      second[SECOND(DATABASE_BASE)] = KPTE(PFN(dbPage));
5617977Shsul@eecs.umich.edu      for (i=DATABASE_BASE; i <DATABASE_END ; i+= 8096) {
5627977Shsul@eecs.umich.edu         ul *db = (ul*)unix_boot_alloc(1);
5637977Shsul@eecs.umich.edu         dbPage[THIRD(i)] = KPTE(PFN(db));
5647977Shsul@eecs.umich.edu      }
5657977Shsul@eecs.umich.edu   }
5667977Shsul@eecs.umich.edu
5677977Shsul@eecs.umich.edu   /* Region 0 */
5687977Shsul@eecs.umich.edu   /* Map the HWRPB */
5697977Shsul@eecs.umich.edu   for (i = 0; i < HWRPB_PAGES; i++) third_rpb[i] = KPTE(PFN(rpb) + i);
5707977Shsul@eecs.umich.edu
5717977Shsul@eecs.umich.edu   /* Map the MDT bitmap table */
5727977Shsul@eecs.umich.edu   for (i=0;i<MDT_BITMAP_PAGES;i++) {
5737977Shsul@eecs.umich.edu      third_rpb[HWRPB_PAGES+i] = KPTE(PFN(mdt_bitmap)+i);
5747977Shsul@eecs.umich.edu   }
5757977Shsul@eecs.umich.edu
5767977Shsul@eecs.umich.edu   /* Protect the PAL pages */
5777977Shsul@eecs.umich.edu   for (i = 1; i < PFN(first); i++) third_rpb[HWRPB_PAGES + MDT_BITMAP_PAGES + i] = KPTE(i);
5787977Shsul@eecs.umich.edu
5797977Shsul@eecs.umich.edu   /* Set up third_kernel after it's loaded, when we know where it is */
5807977Shsul@eecs.umich.edu
5817977Shsul@eecs.umich.edu#ifdef original__xxm
5827977Shsul@eecs.umich.edu   if (unixLoadKernel(AOUT_LOAD_ADDR, argv[1]) == -1) return;
5837977Shsul@eecs.umich.edu   aoutfixup(AOUT_LOAD_ADDR);
5847977Shsul@eecs.umich.edu#else
5857977Shsul@eecs.umich.edu   /* aoutfixup(simosConf.kernelFileHdr); */
5867977Shsul@eecs.umich.edu#endif
5877977Shsul@eecs.umich.edu#if 0
5887977Shsul@eecs.umich.edu   bss = aout_bss_addr;
5897977Shsul@eecs.umich.edu
5907977Shsul@eecs.umich.edu   kern_first_page = (KSEG_TO_PHYS(aout_text_start) / 8192);
5917977Shsul@eecs.umich.edu   kernel_end = ksp_top = ROUNDUP8K(aout_bss_addr + aout_bss_size);
5927977Shsul@eecs.umich.edu   bootadr = aout_entry;
5937977Shsul@eecs.umich.edu#endif
5947977Shsul@eecs.umich.edu
5957977Shsul@eecs.umich.edu   kern_first_page = (KSEG_TO_PHYS(simosConf.kernStart)/8192);
5967977Shsul@eecs.umich.edu   kernel_end = ksp_top = ROUNDUP8K(simosConf.kernEnd);
5977977Shsul@eecs.umich.edu   bootadr = simosConf.entryPoint;
5987977Shsul@eecs.umich.edu
5997977Shsul@eecs.umich.edu
6008009Ssaidi@eecs.umich.edu   printf_lock("HWRPB 0x%x l1pt 0x%x l2pt 0x%x l3pt_rpb 0x%x l3pt_kernel 0x%x l2reserv 0x%x\n",
6017977Shsul@eecs.umich.edu          rpb, first, second, third_rpb, third_kernel,reservedFixup);
6027977Shsul@eecs.umich.edu   if (kernel_end - simosConf.kernStart > (0x800000*NUM_KERNEL_THIRD)) {
6038009Ssaidi@eecs.umich.edu      printf_lock("Kernel is more than 8MB 0x%x - 0x%x = 0x%x\n",
6047977Shsul@eecs.umich.edu             kernel_end, simosConf.kernStart,
6057977Shsul@eecs.umich.edu             kernel_end -simosConf.kernStart );
6067977Shsul@eecs.umich.edu      panic("kernel too big\n");
6077977Shsul@eecs.umich.edu
6087977Shsul@eecs.umich.edu   }
6097977Shsul@eecs.umich.edu   /* Map the kernel's pages into the third level of region 2 */
6107977Shsul@eecs.umich.edu
6117977Shsul@eecs.umich.edu   for (ptr = simosConf.kernStart; ptr < kernel_end; ptr += 8192) {
6127977Shsul@eecs.umich.edu
6137977Shsul@eecs.umich.edu      third_kernel[THIRD_XXX(ptr)] = KPTE(PFN(ptr));
6147977Shsul@eecs.umich.edu   }
6157977Shsul@eecs.umich.edu   /* blow 2 pages of phys mem for guards since it maintains 1-to-1 mapping */
6167977Shsul@eecs.umich.edu   ksp = ksp_top + (3 * 8192);
6177977Shsul@eecs.umich.edu   if (ksp - simosConf.kernStart > (0x800000*NUM_KERNEL_THIRD)) {
6188009Ssaidi@eecs.umich.edu      printf_lock("Kernel stack pushd us over 8MB\n");
6197977Shsul@eecs.umich.edu      panic("ksp too big\n");
6207977Shsul@eecs.umich.edu   }
6217977Shsul@eecs.umich.edu   if (THIRD_XXX((ul)ksp_top) >  NUM_KERNEL_THIRD * 1024) {
6227977Shsul@eecs.umich.edu      panic("increase NUM_KERNEL_THIRD, and change THIRD_XXX\n");
6237977Shsul@eecs.umich.edu   }
6247977Shsul@eecs.umich.edu   ptr = (ul) ksp_top;
6257977Shsul@eecs.umich.edu   bzero((char *)ptr, 8192 * 2);
6267977Shsul@eecs.umich.edu   third_kernel[THIRD_XXX(ptr)] = 0;			/* Stack Guard Page */
6277977Shsul@eecs.umich.edu   ptr += 8192;
6287977Shsul@eecs.umich.edu   third_kernel[THIRD_XXX(ptr)] = KPTE(PFN(ptr));	/* Kernel Stack Pages */
6297977Shsul@eecs.umich.edu   ptr += 8192;
6307977Shsul@eecs.umich.edu   third_kernel[THIRD_XXX(ptr)] = KPTE(PFN(ptr));
6317977Shsul@eecs.umich.edu   ptr += 8192;
6327977Shsul@eecs.umich.edu   third_kernel[THIRD_XXX(ptr)] = 0;			/* Stack Guard Page */
6337977Shsul@eecs.umich.edu
6347977Shsul@eecs.umich.edu   /* put argv into the bottom of the stack - argv starts at 1 because
6357977Shsul@eecs.umich.edu    * the command thatr got us here (i.e. "unixboot) is in argv[0].
6367977Shsul@eecs.umich.edu    */
6377977Shsul@eecs.umich.edu   ksp -= 8;			/* Back up one longword */
6387977Shsul@eecs.umich.edu   ksp -= argc * sizeof(char *);	/* Make room for argv */
6397977Shsul@eecs.umich.edu   kargv = (char **) ksp;
6407977Shsul@eecs.umich.edu   for (i = 1; i < argc; i++) {	/* Copy arguments to stack */
6417977Shsul@eecs.umich.edu      ksp -= ((strlen(argv[i]) + 1) + 7) & ~0x7;
6427977Shsul@eecs.umich.edu      kargv[i-1] = (char *) ksp;
6437977Shsul@eecs.umich.edu      strcpy(kargv[i-1], argv[i]);
6447977Shsul@eecs.umich.edu   }
6457977Shsul@eecs.umich.edu   kargc = i - 1;
6467977Shsul@eecs.umich.edu   kargv[kargc] = NULL;		/* just to be sure; doesn't seem to be used */
6477977Shsul@eecs.umich.edu   ksp -= sizeof(char *);	/* point above last arg for no real reason */
6487977Shsul@eecs.umich.edu
6497977Shsul@eecs.umich.edu   free_pfn = PFN(ptr);
6507977Shsul@eecs.umich.edu
6517977Shsul@eecs.umich.edu   bcopy((char *)&xxm_rpb, (char *)rpb, sizeof(struct rpb));
6527977Shsul@eecs.umich.edu
6537977Shsul@eecs.umich.edu   rpb->rpb_selfref = (struct rpb *) KSEG_TO_PHYS(rpb);
6547977Shsul@eecs.umich.edu   rpb->rpb_string = 0x0000004250525748;
6557977Shsul@eecs.umich.edu
6567977Shsul@eecs.umich.edu   tbb = (ul *) (((char *) rpb) + ROUNDUP8(sizeof(struct rpb)));
6577977Shsul@eecs.umich.edu   rpb->rpb_trans_off = (ul)tbb - (ul)rpb;
6587977Shsul@eecs.umich.edu   bcopy((char *)xxm_tbb, (char *)tbb, sizeof(xxm_tbb));
6597977Shsul@eecs.umich.edu
6607977Shsul@eecs.umich.edu
6617977Shsul@eecs.umich.edu   /*
6627977Shsul@eecs.umich.edu    * rpb_counter. Use to determine timeouts in OS.
6637977Shsul@eecs.umich.edu    * XXX must be patched after a checkpoint restore (I guess)
6647977Shsul@eecs.umich.edu    */
6657977Shsul@eecs.umich.edu
6668009Ssaidi@eecs.umich.edu   printf_lock("CPU Clock at %d MHz IntrClockFrequency=%d \n", simosConf.cpuClock,simosConf.intrClockFrequency);
6677977Shsul@eecs.umich.edu   rpb->rpb_counter = simosConf.cpuClock * 1000 * 1000;
6687977Shsul@eecs.umich.edu
6697977Shsul@eecs.umich.edu   /*
6707977Shsul@eecs.umich.edu    * By definition, the rpb_clock is scaled by 4096 (in hz)
6717977Shsul@eecs.umich.edu    */
6727977Shsul@eecs.umich.edu   rpb->rpb_clock = simosConf.intrClockFrequency * 4096;
6737977Shsul@eecs.umich.edu
6747977Shsul@eecs.umich.edu
6757977Shsul@eecs.umich.edu
6767977Shsul@eecs.umich.edu   /*
6777977Shsul@eecs.umich.edu    * Per CPU Slots. Multiprocessor support.
6787977Shsul@eecs.umich.edu    */
6797977Shsul@eecs.umich.edu   {
6807977Shsul@eecs.umich.edu      int i;
6817977Shsul@eecs.umich.edu      int size = ROUNDUP128(sizeof(struct rpb_percpu));
6827977Shsul@eecs.umich.edu
6838009Ssaidi@eecs.umich.edu      printf_lock("Booting with %d processor(s) \n",simosConf.numCPUs);
6847977Shsul@eecs.umich.edu
6857977Shsul@eecs.umich.edu      rpb->rpb_numprocs = simosConf.numCPUs;
6867977Shsul@eecs.umich.edu      rpb->rpb_slotsize = size;
6877977Shsul@eecs.umich.edu      rpb_percpu = (struct rpb_percpu *)
6887977Shsul@eecs.umich.edu         ROUNDUP128(((ul) tbb) +(sizeof(xxm_tbb)));
6897977Shsul@eecs.umich.edu
6907977Shsul@eecs.umich.edu      rpb->rpb_percpu_off = (ul)rpb_percpu - (ul)rpb;
6917977Shsul@eecs.umich.edu
6927977Shsul@eecs.umich.edu      for (i=0;i<simosConf.numCPUs;i++) {
6937977Shsul@eecs.umich.edu         struct rpb_percpu *thisCPU = (struct rpb_percpu*)
6947977Shsul@eecs.umich.edu            ((ul)rpb_percpu + size*i);
6957977Shsul@eecs.umich.edu
6967977Shsul@eecs.umich.edu         bzero((char *)thisCPU, size);
6977977Shsul@eecs.umich.edu         bcopy((char *)&xxm_rpb_percpu,
6987977Shsul@eecs.umich.edu               (char *)thisCPU,
6997977Shsul@eecs.umich.edu               sizeof(struct rpb_percpu));
7007977Shsul@eecs.umich.edu
7017977Shsul@eecs.umich.edu         thisCPU->rpb_pcb.rpb_ksp = ksp;
7027977Shsul@eecs.umich.edu         thisCPU->rpb_pcb.rpb_ptbr = PFN(first);
7037977Shsul@eecs.umich.edu
7047977Shsul@eecs.umich.edu         thisCPU->rpb_logout = KSEG_TO_PHYS(percpu_logout);
7057977Shsul@eecs.umich.edu         thisCPU->rpb_logout_len = 8192;
7067977Shsul@eecs.umich.edu
7077977Shsul@eecs.umich.edu/*  thisCPU->rpb_pcb.rpb_ptbr = PFN(second);*/
7087977Shsul@eecs.umich.edu
7098009Ssaidi@eecs.umich.edu         printf_lock("KSP: 0x%x PTBR 0x%x\n", thisCPU->rpb_pcb.rpb_ksp, thisCPU->rpb_pcb.rpb_ptbr);
7107977Shsul@eecs.umich.edu
7117977Shsul@eecs.umich.edu         if (i) {
7127977Shsul@eecs.umich.edu            bootStrapImpure[i] = (ul)unix_boot_alloc(1);
7137977Shsul@eecs.umich.edu         }
7147977Shsul@eecs.umich.edu
7157977Shsul@eecs.umich.edu      }
7167977Shsul@eecs.umich.edu
7177977Shsul@eecs.umich.edu      nextPtr = (ul)rpb_percpu + size*simosConf.numCPUs;
7187977Shsul@eecs.umich.edu   }
7197977Shsul@eecs.umich.edu
7207977Shsul@eecs.umich.edu   /*
7217977Shsul@eecs.umich.edu    * Console Terminal Block
7227977Shsul@eecs.umich.edu    */
7237977Shsul@eecs.umich.edu
7247977Shsul@eecs.umich.edu
7257977Shsul@eecs.umich.edu      rpb_ctb = (struct rpb_ctb *) nextPtr;
7267977Shsul@eecs.umich.edu      ctb_tt = (struct ctb_tt*) rpb_ctb;
7277977Shsul@eecs.umich.edu
7287977Shsul@eecs.umich.edu      rpb->rpb_ctb_off = ((ul)rpb_ctb) - (ul)rpb;
7297977Shsul@eecs.umich.edu      rpb->rpb_ctb_size  = sizeof(struct rpb_ctb);
7307977Shsul@eecs.umich.edu
7317977Shsul@eecs.umich.edu   bzero((char *)rpb_ctb, sizeof(struct ctb_tt));
7327977Shsul@eecs.umich.edu
7337977Shsul@eecs.umich.edu#ifdef original_xxm
7347977Shsul@eecs.umich.edu   if (tga_slot == -1)
7357977Shsul@eecs.umich.edu      rpb_ctb->rpb_type = CONS_DZ;
7367977Shsul@eecs.umich.edu  else {
7377977Shsul@eecs.umich.edu    rpb_ctb->rpb_type = CONS_GRPH;
7387977Shsul@eecs.umich.edu    rpb_ctb->rpb_unit = (SLOTINFO_PCI << 16) | (0 << 8) | tga_slot;
7397977Shsul@eecs.umich.edu  }
7407977Shsul@eecs.umich.edu#else
7417977Shsul@eecs.umich.edu  rpb_ctb->rpb_type = CONS_DZ;
7427977Shsul@eecs.umich.edu#endif
7437977Shsul@eecs.umich.edu
7447977Shsul@eecs.umich.edu  rpb_ctb->rpb_length = sizeof(ctb_tt)-sizeof(rpb_ctb);
7457977Shsul@eecs.umich.edu
7467977Shsul@eecs.umich.edu  /*
7477977Shsul@eecs.umich.edu   * uart initizliation
7487977Shsul@eecs.umich.edu   */
7497977Shsul@eecs.umich.edu  ctb_tt->ctb_csr = 0;
7507977Shsul@eecs.umich.edu  ctb_tt->ctb_tivec = 0x6c0;  /* matches tlaser pal code */
7517977Shsul@eecs.umich.edu  ctb_tt->ctb_rivec = 0x680;  /* matches tlaser pal code */
7527977Shsul@eecs.umich.edu  ctb_tt->ctb_baud = 9600;
7537977Shsul@eecs.umich.edu  ctb_tt->ctb_put_sts = 0;
7547977Shsul@eecs.umich.edu  ctb_tt->ctb_get_sts = 0;
7557977Shsul@eecs.umich.edu
7567977Shsul@eecs.umich.edu
7577977Shsul@eecs.umich.edu  rpb_crb = (struct rpb_crb *) (((ul)rpb_ctb) + sizeof(struct ctb_tt));
7587977Shsul@eecs.umich.edu  rpb->rpb_crb_off = ((ul)rpb_crb) - (ul)rpb;
7597977Shsul@eecs.umich.edu
7607977Shsul@eecs.umich.edu  bzero((char *)rpb_crb, sizeof(struct rpb_crb));
7617977Shsul@eecs.umich.edu  /*
7627977Shsul@eecs.umich.edu   * console callback stuff (simos)
7637977Shsul@eecs.umich.edu   */
7647977Shsul@eecs.umich.edu
7657977Shsul@eecs.umich.edu  rpb_crb->rpb_num = 1;
7667977Shsul@eecs.umich.edu  rpb_crb->rpb_mapped_pages = HWRPB_PAGES;
7677977Shsul@eecs.umich.edu  rpb_crb->rpb_map[0].rpb_virt = 0x10000000;
7688005Ssaidi@eecs.umich.edu  rpb_crb->rpb_map[0].rpb_phys = KSEG_TO_PHYS(((ul)rpb) & ~0x1fff);
7697977Shsul@eecs.umich.edu  rpb_crb->rpb_map[0].rpb_pgcount = HWRPB_PAGES;
7707977Shsul@eecs.umich.edu
7717977Shsul@eecs.umich.edu
7728010Ssaidi@eecs.umich.edu  printf_lock("Console Callback at 0x%x, fixup at 0x%x, crb offset: 0x%x\n",
7737977Shsul@eecs.umich.edu          rpb_crb->rpb_va_disp,
7748010Ssaidi@eecs.umich.edu          rpb_crb->rpb_va_fixup,
7758010Ssaidi@eecs.umich.edu          rpb->rpb_crb_off);
7767977Shsul@eecs.umich.edu
7777977Shsul@eecs.umich.edu  rpb_mdt = (struct _xxm_rpb_mdt *) (((ul)rpb_crb) + sizeof(struct rpb_crb));
7787977Shsul@eecs.umich.edu  rpb->rpb_mdt_off = (ul)rpb_mdt - (ul)rpb;
7797977Shsul@eecs.umich.edu  bcopy((char *)&xxm_rpb_mdt, (char *)rpb_mdt, sizeof(struct _xxm_rpb_mdt));
7807977Shsul@eecs.umich.edu
7817977Shsul@eecs.umich.edu
7827977Shsul@eecs.umich.edu  cl = 0;
7837977Shsul@eecs.umich.edu#ifdef undef
7847977Shsul@eecs.umich.edu  /* Until Digital Unix can handle it, account all pages below the kernel
7857977Shsul@eecs.umich.edu   * as "console" memory. */
7867977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfncount = cons_pages;
7877977Shsul@eecs.umich.edu#endif
7887977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfncount = kern_first_page;
7897977Shsul@eecs.umich.edu  cl++;
7907977Shsul@eecs.umich.edu
7917977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfn = kern_first_page;
7927977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfncount = mem_pages - kern_first_page;
7937977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfntested=rpb_mdt->rpb_cluster[cl].rpb_pfncount;
7947977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pa = KSEG_TO_PHYS(mdt_bitmap);
7957977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_va = 0x10000000 + HWRPB_PAGES * 8192;
7967977Shsul@eecs.umich.edu  cl++;
7977977Shsul@eecs.umich.edu
7987977Shsul@eecs.umich.edu#ifdef undef
7997977Shsul@eecs.umich.edu  /* The stupid Unix kernel needs to have all mdt clusters in ascending
8007977Shsul@eecs.umich.edu   * order, and the last cluster is used to compute the top of memory.
8017977Shsul@eecs.umich.edu   * It can't make use of memory between the console and the kernel.
8027977Shsul@eecs.umich.edu   */
8037977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfn = cons_pages;
8047977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfncount = kern_first_page - cons_pages;
8057977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfntested=rpb_mdt->rpb_cluster[cl].rpb_pfncount;
8067977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pa = KSEG_TO_PHYS(mdt_bitmap);
8077977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_va = 0x10000000 + HWRPB_PAGES * 8192;
8087977Shsul@eecs.umich.edu  cl++;
8097977Shsul@eecs.umich.edu#endif
8107977Shsul@eecs.umich.edu
8117977Shsul@eecs.umich.edu  rpb_mdt->rpb_numcl = cl;
8127977Shsul@eecs.umich.edu
8137977Shsul@eecs.umich.edu  for (i = 0; i < cl; i++)
8148009Ssaidi@eecs.umich.edu    printf_lock("Memory cluster %d [%d - %d]\n", i, rpb_mdt->rpb_cluster[i].rpb_pfn, rpb_mdt->rpb_cluster[i].rpb_pfncount);
8157977Shsul@eecs.umich.edu
8167977Shsul@eecs.umich.edu
8177977Shsul@eecs.umich.edu
8187977Shsul@eecs.umich.edu  /* Checksum the rpb for good luck */
8197977Shsul@eecs.umich.edu  sum = 0;
8207977Shsul@eecs.umich.edu  lp1 = (long *)&rpb_mdt->rpb_impaddr;
8217977Shsul@eecs.umich.edu  lp2 = (long *)&rpb_mdt->rpb_cluster[cl];
8227977Shsul@eecs.umich.edu  while (lp1 < lp2) sum += *lp1++;
8237977Shsul@eecs.umich.edu  rpb_mdt->rpb_checksum = sum;
8247977Shsul@eecs.umich.edu
8257977Shsul@eecs.umich.edu  /* XXX should checksum the cluster descriptors */
8267977Shsul@eecs.umich.edu
8277977Shsul@eecs.umich.edu  bzero((char *)mdt_bitmap, MDT_BITMAP_PAGES * 8192);
8287977Shsul@eecs.umich.edu  for (i = 0; i < mem_pages/8; i++) ((unsigned char *)mdt_bitmap)[i] = 0xff;
8297977Shsul@eecs.umich.edu
8308009Ssaidi@eecs.umich.edu  printf_lock("Initalizing mdt_bitmap addr 0x%x mem_pages %x \n",
8317977Shsul@eecs.umich.edu         (long)mdt_bitmap,(long)mem_pages);
8327977Shsul@eecs.umich.edu
8337977Shsul@eecs.umich.edu  xxm_rpb.rpb_config_off = 0;
8347977Shsul@eecs.umich.edu  xxm_rpb.rpb_fru_off = 0;
8357977Shsul@eecs.umich.edu
8367977Shsul@eecs.umich.edu  rpb_dsr = (struct rpb_dsr *) (((ul)rpb_mdt) + sizeof(struct _xxm_rpb_mdt));
8377977Shsul@eecs.umich.edu  rpb->rpb_dsr_off = ((ul)rpb_dsr) - (ul)rpb;
8387977Shsul@eecs.umich.edu  bzero((char *)rpb_dsr, sizeof(struct rpb_dsr));
8397977Shsul@eecs.umich.edu  rpb_dsr->rpb_smm = 1578; /* Official XXM SMM number as per SRM */
8407977Shsul@eecs.umich.edu  rpb_dsr->rpb_smm = 1089; /* Official Alcor SMM number as per SRM */
8417977Shsul@eecs.umich.edu
8427977Shsul@eecs.umich.edu  rpb_lurt = (int *) ROUNDUP8(((ul)rpb_dsr) + sizeof(struct rpb_dsr));
8437977Shsul@eecs.umich.edu  rpb_dsr->rpb_lurt_off = ((ul) rpb_lurt) - (ul) rpb_dsr;
8447977Shsul@eecs.umich.edu  bcopy((char *)xxm_lurt, (char *)rpb_lurt, sizeof(xxm_lurt));
8457977Shsul@eecs.umich.edu
8467977Shsul@eecs.umich.edu  rpb_name = (char *) ROUNDUP8(((ul)rpb_lurt) + sizeof(xxm_lurt));
8477977Shsul@eecs.umich.edu  rpb_dsr->rpb_sysname_off = ((ul) rpb_name) - (ul) rpb_dsr;
8488004Ssaidi@eecs.umich.edu#define THENAME "             M5/Alpha       "
8497977Shsul@eecs.umich.edu  sum = sizeof(THENAME);
8507977Shsul@eecs.umich.edu  bcopy(THENAME, rpb_name, sum);
8517977Shsul@eecs.umich.edu  *(ul *)rpb_name = sizeof(THENAME); /* put in length field */
8527977Shsul@eecs.umich.edu
8537977Shsul@eecs.umich.edu  /* calculate size of rpb */
8547977Shsul@eecs.umich.edu  rpb->rpb_size = ((ul) &rpb_name[sum]) - (ul)rpb;
8557977Shsul@eecs.umich.edu
8567977Shsul@eecs.umich.edu  if (rpb->rpb_size > 8192*HWRPB_PAGES) {
8577977Shsul@eecs.umich.edu     panic("HWRPB_PAGES=%d too small for HWRPB !!! \n");
8587977Shsul@eecs.umich.edu  }
8597977Shsul@eecs.umich.edu
8607977Shsul@eecs.umich.edu
8617977Shsul@eecs.umich.edu {
8627977Shsul@eecs.umich.edu     ul *ptr = (ul*)((char*)rpb_dsr + sizeof(struct rpb_dsr ));
8637977Shsul@eecs.umich.edu     rpb_crb->rpb_pa_disp = KSEG_TO_PHYS(ptr);
8648010Ssaidi@eecs.umich.edu     rpb_crb->rpb_va_disp = 0x10000000 + (((ul)ptr - (ul)rpb) & (0x2000*HWRPB_PAGES-1));
8658009Ssaidi@eecs.umich.edu     printf_lock("ConsoleDispatch at virt %x phys %x val %x\n",
8667977Shsul@eecs.umich.edu             rpb_crb->rpb_va_disp,
8677977Shsul@eecs.umich.edu            rpb_crb->rpb_pa_disp,
8687977Shsul@eecs.umich.edu            consoleCallback);
8697977Shsul@eecs.umich.edu     *ptr++ = 0;
8707977Shsul@eecs.umich.edu     *ptr++ = (ul) consoleCallback;
8717977Shsul@eecs.umich.edu     rpb_crb->rpb_pa_fixup = KSEG_TO_PHYS(ptr);
8728010Ssaidi@eecs.umich.edu     rpb_crb->rpb_va_fixup = 0x10000000 + (((ul)ptr - (ul)rpb) & (0x2000*HWRPB_PAGES-1));
8737977Shsul@eecs.umich.edu     *ptr++ = 0;
8748010Ssaidi@eecs.umich.edu
8757977Shsul@eecs.umich.edu     *ptr++ = (ul) consoleFixup;
8767977Shsul@eecs.umich.edu  }
8777977Shsul@eecs.umich.edu
8787977Shsul@eecs.umich.edu
8797977Shsul@eecs.umich.edu  /* Checksum the rpb for good luck */
8807977Shsul@eecs.umich.edu  sum = 0;
8817977Shsul@eecs.umich.edu  lp1 = (long *)rpb;
8827977Shsul@eecs.umich.edu  lp2 = &rpb->rpb_checksum;
8837977Shsul@eecs.umich.edu  while (lp1 < lp2)
8847977Shsul@eecs.umich.edu    sum += *lp1++;
8857977Shsul@eecs.umich.edu  *lp2 = sum;
8867977Shsul@eecs.umich.edu
8877977Shsul@eecs.umich.edu
8887977Shsul@eecs.umich.edu  /*
8897977Shsul@eecs.umich.edu   * MP bootstrap
8907977Shsul@eecs.umich.edu   */
8917977Shsul@eecs.umich.edu
8927977Shsul@eecs.umich.edu  {
8937977Shsul@eecs.umich.edu     int i;
8947977Shsul@eecs.umich.edu     for (i=1;i<simosConf.numCPUs;i++) {
8957978Sbinkertn@umich.edu        volatile struct AlphaAccess *k1Conf = (volatile struct AlphaAccess *)
8967999Ssaidi@eecs.umich.edu           (ALPHA_ACCESS_BASE);
8978009Ssaidi@eecs.umich.edu        printf_lock("Bootstraping CPU %d with sp=0x%x \n",
8987977Shsul@eecs.umich.edu               i,bootStrapImpure[i]);
8997977Shsul@eecs.umich.edu        k1Conf->bootStrapImpure = bootStrapImpure[i];
9007977Shsul@eecs.umich.edu        k1Conf->bootStrapCPU = i;
9017977Shsul@eecs.umich.edu     }
9027977Shsul@eecs.umich.edu  }
9037977Shsul@eecs.umich.edu
9047977Shsul@eecs.umich.edu  /*
9057977Shsul@eecs.umich.edu   * Make sure that we are not stepping on the kernel
9067977Shsul@eecs.umich.edu   */
9077977Shsul@eecs.umich.edu  if ((ul)unix_boot_mem >= (ul)simosConf.kernStart) {
9087977Shsul@eecs.umich.edu     panic("CONSOLE: too much memory. Smashing kernel  \n");
9097977Shsul@eecs.umich.edu  } else {
9108009Ssaidi@eecs.umich.edu     printf_lock("unix_boot_mem ends at %x \n",unix_boot_mem);
9117977Shsul@eecs.umich.edu  }
9127977Shsul@eecs.umich.edu
9137977Shsul@eecs.umich.edu
9147977Shsul@eecs.umich.edu#ifdef undef
9157977Shsul@eecs.umich.edu#define CSERVE_K_JTOKERN	0x18
9167977Shsul@eecs.umich.edu  cServe(bootadr, (ul) rpb_percpu, CSERVE_K_JTOKERN, free_pfn);
9177977Shsul@eecs.umich.edu#endif
9187977Shsul@eecs.umich.edu
9197977Shsul@eecs.umich.edu  if (go) JToKern(bootadr, rpb_percpu, free_pfn, kargc, kargv, NULL);
9207977Shsul@eecs.umich.edu}
9217977Shsul@eecs.umich.edu
9227977Shsul@eecs.umich.edu
9237977Shsul@eecs.umich.edu#if 0
9247977Shsul@eecs.umich.eduaoutfixup(char *p)
9257977Shsul@eecs.umich.edu{
9267977Shsul@eecs.umich.edu  int i;
9277977Shsul@eecs.umich.edu  unsigned long rem, len, off, dst;
9287977Shsul@eecs.umich.edu
9297977Shsul@eecs.umich.edu
9307977Shsul@eecs.umich.edu  struct new_aouthdr *ao = (struct new_aouthdr *) &p[NEW_FILHSZ];
9317977Shsul@eecs.umich.edu#if 0
9327977Shsul@eecs.umich.edu  struct scnhdr *s = (struct scnhdr *) &p[FILHSZ + AOUTHSZ];
9337977Shsul@eecs.umich.edu  struct scnhdr *t, *d, *b;
9347977Shsul@eecs.umich.edu  printf("aoutfixup: %d sections \n",fh->f_nscns);
9357977Shsul@eecs.umich.edu#endif
9367977Shsul@eecs.umich.edu
9377977Shsul@eecs.umich.edu
9387977Shsul@eecs.umich.edu  aout_text_start = ((ul)ao->text_start_hi<<32) + ao->text_start;
9397977Shsul@eecs.umich.edu  aout_data_addr = ((ul)ao->data_start_hi<<32) + ao->data_start;
9407977Shsul@eecs.umich.edu  aout_bss_addr = ((ul)ao->bss_start_hi<<32) + ao->bss_start;
9417977Shsul@eecs.umich.edu  aout_bss_size = ((ul)ao->bsize_hi<<32) +  ao->bsize;
9427977Shsul@eecs.umich.edu  aout_entry = ((ul)ao->entry_hi<<32) + ao->entry;
9437977Shsul@eecs.umich.edu
9447977Shsul@eecs.umich.edu  printf("_text 0x%16x %8d @ %08d\n", aout_text_start, ao->tsize,0 /* t->s_scnptr*/);
9457977Shsul@eecs.umich.edu  printf("_data 0x%16x %8d @ %08d\n", aout_data_addr, ao->dsize,0/* d->s_scnptr*/);
9467977Shsul@eecs.umich.edu  printf("_bss  0x%16x %8d\n", aout_bss_addr,  ao->bsize);
9477977Shsul@eecs.umich.edu  printf("entry 0x%16x\n", aout_entry);
9487977Shsul@eecs.umich.edu#if 0
9497977Shsul@eecs.umich.edu  for (i = 0; i < fh->f_nscns; i++) {
9507977Shsul@eecs.umich.edu     printf("section %d %s \n",i,s[i].s_name);
9517977Shsul@eecs.umich.edu    if (!strcmp(s[i].s_name, ".text")) t = &s[i];
9527977Shsul@eecs.umich.edu    else if (!strcmp(s[i].s_name, ".data")) d = &s[i];
9537977Shsul@eecs.umich.edu    else if (!strcmp(s[i].s_name, ".bss")) b = &s[i];
9547977Shsul@eecs.umich.edu  }
9557977Shsul@eecs.umich.edu  bcopy(&p[t->s_scnptr], (char *)ao->text_start, ao->tsize);
9567977Shsul@eecs.umich.edu  bcopy(&p[d->s_scnptr], (char *)ao->data_start, ao->dsize);
9577977Shsul@eecs.umich.edu#endif
9587977Shsul@eecs.umich.edu}
9597977Shsul@eecs.umich.edu#endif
9607977Shsul@eecs.umich.edu
9617977Shsul@eecs.umich.eduextern ui palJToKern[];
9627977Shsul@eecs.umich.edu
9637977Shsul@eecs.umich.eduJToKern(bootadr, rpb_percpu, free_pfn, k_argc, k_argv, envp)
9647977Shsul@eecs.umich.educhar * bootadr;
9657977Shsul@eecs.umich.eduul rpb_percpu;
9667977Shsul@eecs.umich.eduul free_pfn;
9677977Shsul@eecs.umich.eduul k_argc;
9687977Shsul@eecs.umich.educhar **k_argv;
9697977Shsul@eecs.umich.educhar **envp;
9707977Shsul@eecs.umich.edu{
9717977Shsul@eecs.umich.edu  struct _kernel_params *kernel_params = (struct _kernel_params *) KSEG;
9727977Shsul@eecs.umich.edu  int i;
9737977Shsul@eecs.umich.edu
9748009Ssaidi@eecs.umich.edu  printf_lock("k_argc = %d ", k_argc);
9757977Shsul@eecs.umich.edu  for (i = 0; i < k_argc; i++) {
9768009Ssaidi@eecs.umich.edu    printf_lock("'%s' ", k_argv[i]);
9777977Shsul@eecs.umich.edu  }
9788009Ssaidi@eecs.umich.edu  printf_lock("\n");
9797977Shsul@eecs.umich.edu
9807977Shsul@eecs.umich.edu/*  rpb_percpu |= 0xfffffc0000000000;*/
9817977Shsul@eecs.umich.edu  kernel_params->bootadr = bootadr;
9827977Shsul@eecs.umich.edu  kernel_params->rpb_percpu = KSEG_TO_PHYS(rpb_percpu);
9837977Shsul@eecs.umich.edu  kernel_params->free_pfn = free_pfn;
9847977Shsul@eecs.umich.edu  kernel_params->argc = k_argc;
9857977Shsul@eecs.umich.edu  kernel_params->argv = (ul)k_argv;
9867977Shsul@eecs.umich.edu  kernel_params->envp = (ul)envp;
9878009Ssaidi@eecs.umich.edu  printf_lock("jumping to kernel at 0x%x, (PCBB 0x%x pfn %d)\n", bootadr, rpb_percpu, free_pfn);
9887977Shsul@eecs.umich.edu  jToPal(KSEG_TO_PHYS((ul)palJToKern));
9898009Ssaidi@eecs.umich.edu  printf_lock("returned from jToPal. Looping\n");
9907977Shsul@eecs.umich.edu  while(1) continue;
9917977Shsul@eecs.umich.edu}
9927977Shsul@eecs.umich.edu
9937977Shsul@eecs.umich.edu
9947977Shsul@eecs.umich.eduvoid jToPal(ul bootadr)
9957977Shsul@eecs.umich.edu{
9967977Shsul@eecs.umich.edu  cServe(bootadr, 0, CSERVE_K_JTOPAL);
9977977Shsul@eecs.umich.edu
9987977Shsul@eecs.umich.edu/*
9997977Shsul@eecs.umich.edu * Make sure that floating point is enabled incase
10007977Shsul@eecs.umich.edu * it was disabled by the user program.
10017977Shsul@eecs.umich.edu */
10027977Shsul@eecs.umich.edu  wrfen(1);
10037977Shsul@eecs.umich.edu}
10047977Shsul@eecs.umich.edu
10057977Shsul@eecs.umich.edu
10067977Shsul@eecs.umich.eduint strcpy(char *dst, char *src)
10077977Shsul@eecs.umich.edu{
10087977Shsul@eecs.umich.edu   int i=0;
10097977Shsul@eecs.umich.edu   while(*src) {
10107977Shsul@eecs.umich.edu      *dst++ = *src++;
10117977Shsul@eecs.umich.edu      i++;
10127977Shsul@eecs.umich.edu   }
10137977Shsul@eecs.umich.edu   return i;
10147977Shsul@eecs.umich.edu}
10157977Shsul@eecs.umich.edu
10167977Shsul@eecs.umich.edu
10177977Shsul@eecs.umich.edu
10187977Shsul@eecs.umich.edu
10197977Shsul@eecs.umich.edu/* *****************************************
10207977Shsul@eecs.umich.edu * Console I/O
10217977Shsul@eecs.umich.edu * ******************************************/
10227977Shsul@eecs.umich.edu
10237977Shsul@eecs.umich.eduint numOpenDevices = 11;
10247977Shsul@eecs.umich.edustruct {
10257977Shsul@eecs.umich.edu   char name[128];
10267977Shsul@eecs.umich.edu} deviceState[32];
10277977Shsul@eecs.umich.edu
10287978Sbinkertn@umich.edu#define BOOTDEVICE_NAME "SCSI 1 0 0 1 100 0"
10297977Shsul@eecs.umich.edu
10307978Sbinkertn@umich.eduvoid
10317978Sbinkertn@umich.eduDeviceOperation(long op, long channel, long count, long address, long block)
10327977Shsul@eecs.umich.edu{
10337978Sbinkertn@umich.edu   struct AlphaAccess *k1Conf = (struct AlphaAccess *)
10347999Ssaidi@eecs.umich.edu      (ALPHA_ACCESS_BASE);
10357977Shsul@eecs.umich.edu
10367977Shsul@eecs.umich.edu   long pAddr;
10377977Shsul@eecs.umich.edu
10387977Shsul@eecs.umich.edu#if 0
10397977Shsul@eecs.umich.edu   printf("Console::DeviceRead count=0x%x address=0x%x block=0x%x\n",
10407977Shsul@eecs.umich.edu          count,address,block);
10417977Shsul@eecs.umich.edu#endif
10427977Shsul@eecs.umich.edu
10437977Shsul@eecs.umich.edu   if (strcmp(deviceState[channel].name, BOOTDEVICE_NAME )) {
10447977Shsul@eecs.umich.edu      panic("DeviceRead: only implemented for root disk \n");
10457977Shsul@eecs.umich.edu   }
10467977Shsul@eecs.umich.edu   pAddr = KSEG_TO_PHYS(address);
10477977Shsul@eecs.umich.edu   if (pAddr + count > simosConf.mem_size) {
10487977Shsul@eecs.umich.edu      panic("DeviceRead: request out of range \n");
10497977Shsul@eecs.umich.edu   }
10507977Shsul@eecs.umich.edu
10517977Shsul@eecs.umich.edu   k1Conf->diskCount = count;
10527977Shsul@eecs.umich.edu   k1Conf->diskPAddr = pAddr;
10537977Shsul@eecs.umich.edu   k1Conf->diskBlock = block;
10547977Shsul@eecs.umich.edu   k1Conf->diskOperation = op; /* launch */
10557977Shsul@eecs.umich.edu}
10567977Shsul@eecs.umich.edu
10577977Shsul@eecs.umich.edu
10587977Shsul@eecs.umich.edu
10597977Shsul@eecs.umich.edu/* *************************************************************************
10607977Shsul@eecs.umich.edu * SimoS Console callbacks
10617977Shsul@eecs.umich.edu * **************************************************/
10627977Shsul@eecs.umich.edu
10637977Shsul@eecs.umich.edu/* AXP manual 2-31 */
10647977Shsul@eecs.umich.edu#define CONSCB_GETC 0x1
10657977Shsul@eecs.umich.edu#define CONSCB_PUTS 0x2
10667977Shsul@eecs.umich.edu#define CONSCB_RESET_TERM 0x3
10677977Shsul@eecs.umich.edu#define CONSCB_SET_TERM_INT 0x4
10687977Shsul@eecs.umich.edu#define CONSCB_SET_TERM_CTL 0x5
10697977Shsul@eecs.umich.edu#define CONSCB_PROCESS_KEY 0x6
10707982Ssaidi@eecs.umich.edu#define CONSCB_OPEN_CONSOLE 0x7
10717982Ssaidi@eecs.umich.edu#define CONSCB_CLOSE_CONSOLE 0x8
10727977Shsul@eecs.umich.edu
10737977Shsul@eecs.umich.edu#define CONSCB_OPEN 0x10
10747977Shsul@eecs.umich.edu#define CONSCB_CLOSE 0x11
10757977Shsul@eecs.umich.edu#define CONSCB_READ 0x13
10767977Shsul@eecs.umich.edu
10777977Shsul@eecs.umich.edu#define CONSCB_GETENV 0x22
10787977Shsul@eecs.umich.edu
10797977Shsul@eecs.umich.edu/* AXP manual 2-26 */
10807978Sbinkertn@umich.edu#define	ENV_AUTO_ACTION		0X01
10817978Sbinkertn@umich.edu#define	ENV_BOOT_DEV		0X02
10827978Sbinkertn@umich.edu#define	ENV_BOOTDEF_DEV		0X03
10837978Sbinkertn@umich.edu#define	ENV_BOOTED_DEV		0X04
10847978Sbinkertn@umich.edu#define	ENV_BOOT_FILE		0X05
10857978Sbinkertn@umich.edu#define	ENV_BOOTED_FILE		0X06
10867978Sbinkertn@umich.edu#define	ENV_BOOT_OSFLAGS	0X07
10877978Sbinkertn@umich.edu#define	ENV_BOOTED_OSFLAGS	0X08
10887978Sbinkertn@umich.edu#define	ENV_BOOT_RESET		0X09
10897978Sbinkertn@umich.edu#define	ENV_DUMP_DEV		0X0A
10907978Sbinkertn@umich.edu#define	ENV_ENABLE_AUDIT	0X0B
10917978Sbinkertn@umich.edu#define	ENV_LICENSE		0X0C
10927978Sbinkertn@umich.edu#define	ENV_CHAR_SET		0X0D
10937978Sbinkertn@umich.edu#define	ENV_LANGUAGE		0X0E
10947978Sbinkertn@umich.edu#define	ENV_TTY_DEV		0X0F
10957978Sbinkertn@umich.edu#define	ENV_SCSIID		0X42
10967978Sbinkertn@umich.edu#define	ENV_SCSIFAST		0X43
10977978Sbinkertn@umich.edu#define	ENV_COM1_BAUD		0X44
10987978Sbinkertn@umich.edu#define	ENV_COM1_MODEM		0X45
10997978Sbinkertn@umich.edu#define	ENV_COM1_FLOW		0X46
11007978Sbinkertn@umich.edu#define	ENV_COM1_MISC		0X47
11017978Sbinkertn@umich.edu#define	ENV_COM2_BAUD		0X48
11027978Sbinkertn@umich.edu#define	ENV_COM2_MODEM		0X49
11037978Sbinkertn@umich.edu#define	ENV_COM2_FLOW		0X4A
11047978Sbinkertn@umich.edu#define	ENV_COM2_MISC		0X4B
11057978Sbinkertn@umich.edu#define	ENV_PASSWORD		0X4C
11067978Sbinkertn@umich.edu#define	ENV_SECURE		0X4D
11077978Sbinkertn@umich.edu#define	ENV_LOGFAIL		0X4E
11087978Sbinkertn@umich.edu#define	ENV_SRM2DEV_ID		0X4F
11097977Shsul@eecs.umich.edu
11107978Sbinkertn@umich.edu#define MAX_ENVLEN 32
11117977Shsul@eecs.umich.edu
11127979Sbinkertn@umich.educhar	env_auto_action[MAX_ENVLEN]	= "BOOT";
11137978Sbinkertn@umich.educhar	env_boot_dev[MAX_ENVLEN]	= "";
11147978Sbinkertn@umich.educhar	env_bootdef_dev[MAX_ENVLEN]	= "";
11157979Sbinkertn@umich.educhar	env_booted_dev[MAX_ENVLEN]	= BOOTDEVICE_NAME;
11167978Sbinkertn@umich.educhar	env_boot_file[MAX_ENVLEN]	= "";
11177978Sbinkertn@umich.educhar	env_booted_file[MAX_ENVLEN]	= "";
11187978Sbinkertn@umich.educhar	env_boot_osflags[MAX_ENVLEN]	= "";
11197979Sbinkertn@umich.educhar	env_booted_osflags[MAX_ENVLEN]	= "";
11207978Sbinkertn@umich.educhar	env_boot_reset[MAX_ENVLEN]	= "";
11217978Sbinkertn@umich.educhar	env_dump_dev[MAX_ENVLEN]	= "";
11227978Sbinkertn@umich.educhar	env_enable_audit[MAX_ENVLEN]	= "";
11237978Sbinkertn@umich.educhar	env_license[MAX_ENVLEN]		= "";
11247978Sbinkertn@umich.educhar	env_char_set[MAX_ENVLEN]	= "";
11257979Sbinkertn@umich.educhar	env_language[MAX_ENVLEN]	= "";
11267979Sbinkertn@umich.educhar	env_tty_dev[MAX_ENVLEN]		= "0";
11277978Sbinkertn@umich.educhar	env_scsiid[MAX_ENVLEN]		= "";
11287978Sbinkertn@umich.educhar	env_scsifast[MAX_ENVLEN]	= "";
11297979Sbinkertn@umich.educhar	env_com1_baud[MAX_ENVLEN]	= "";
11307978Sbinkertn@umich.educhar	env_com1_modem[MAX_ENVLEN]	= "";
11317978Sbinkertn@umich.educhar	env_com1_flow[MAX_ENVLEN]	= "";
11327978Sbinkertn@umich.educhar	env_com1_misc[MAX_ENVLEN]	= "";
11337978Sbinkertn@umich.educhar	env_com2_baud[MAX_ENVLEN]	= "";
11347978Sbinkertn@umich.educhar	env_com2_modem[MAX_ENVLEN]	= "";
11357978Sbinkertn@umich.educhar	env_com2_flow[MAX_ENVLEN]	= "";
11367978Sbinkertn@umich.educhar	env_com2_misc[MAX_ENVLEN]	= "";
11377978Sbinkertn@umich.educhar	env_password[MAX_ENVLEN]	= "";
11387979Sbinkertn@umich.educhar	env_secure[MAX_ENVLEN]		= "";
11397978Sbinkertn@umich.educhar	env_logfail[MAX_ENVLEN]		= "";
11407978Sbinkertn@umich.educhar	env_srm2dev_id[MAX_ENVLEN]	= "";
11417979Sbinkertn@umich.edu
11427979Sbinkertn@umich.edu#define MAX_ENV_INDEX 100
11437979Sbinkertn@umich.educhar *env_ptr[MAX_ENV_INDEX] =
11447979Sbinkertn@umich.edu{
11457979Sbinkertn@umich.edu    0,					/* 0x00 */
11467979Sbinkertn@umich.edu    env_auto_action,			/* 0x01 */
11477979Sbinkertn@umich.edu    env_boot_dev,			/* 0x02 */
11487979Sbinkertn@umich.edu    env_bootdef_dev,			/* 0x03 */
11497979Sbinkertn@umich.edu    env_booted_dev,			/* 0x04 */
11507979Sbinkertn@umich.edu    env_boot_file,			/* 0x05 */
11517979Sbinkertn@umich.edu    env_booted_file,			/* 0x06 */
11527979Sbinkertn@umich.edu    env_boot_osflags,			/* 0x07 */
11537979Sbinkertn@umich.edu    env_booted_osflags,			/* 0x08 */
11547979Sbinkertn@umich.edu    env_boot_reset,			/* 0x09 */
11557979Sbinkertn@umich.edu    env_dump_dev,			/* 0x0A */
11567979Sbinkertn@umich.edu    env_enable_audit,			/* 0x0B */
11577979Sbinkertn@umich.edu    env_license,			/* 0x0C */
11587979Sbinkertn@umich.edu    env_char_set,			/* 0x0D */
11597979Sbinkertn@umich.edu    (char *)&env_language,		/* 0x0E */
11607979Sbinkertn@umich.edu    env_tty_dev,			/* 0x0F */
11617979Sbinkertn@umich.edu    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,	/* 0x10 - 0x1F */
11627979Sbinkertn@umich.edu    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,	/* 0x20 - 0x2F */
11637979Sbinkertn@umich.edu    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,	/* 0x30 - 0x3F */
11647979Sbinkertn@umich.edu    0,					/* 0x40 */
11657979Sbinkertn@umich.edu    0,					/* 0x41 */
11667979Sbinkertn@umich.edu    env_scsiid,				/* 0x42 */
11677979Sbinkertn@umich.edu    env_scsifast,			/* 0x43 */
11687979Sbinkertn@umich.edu    env_com1_baud,			/* 0x44 */
11697979Sbinkertn@umich.edu    env_com1_modem,			/* 0x45 */
11707979Sbinkertn@umich.edu    env_com1_flow,			/* 0x46 */
11717979Sbinkertn@umich.edu    env_com1_misc,			/* 0x47 */
11727979Sbinkertn@umich.edu    env_com2_baud,			/* 0x48 */
11737979Sbinkertn@umich.edu    env_com2_modem,			/* 0x49 */
11747979Sbinkertn@umich.edu    env_com2_flow,			/* 0x4A */
11757979Sbinkertn@umich.edu    env_com2_misc,			/* 0x4B */
11767979Sbinkertn@umich.edu    env_password,			/* 0x4C */
11777979Sbinkertn@umich.edu    env_secure,				/* 0x4D */
11787979Sbinkertn@umich.edu    env_logfail,			/* 0x4E */
11797979Sbinkertn@umich.edu    env_srm2dev_id,			/* 0x4F */
11807979Sbinkertn@umich.edu    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,	/* 0x50 - 0x5F */
11817979Sbinkertn@umich.edu    0,					/* 0x60 */
11827979Sbinkertn@umich.edu    0,					/* 0x61 */
11837979Sbinkertn@umich.edu    0,					/* 0x62 */
11847979Sbinkertn@umich.edu    0,					/* 0x63 */
11857979Sbinkertn@umich.edu};
11867978Sbinkertn@umich.edu
11877978Sbinkertn@umich.edulong
11887978Sbinkertn@umich.eduCallBackDispatcher(long a0, long a1, long a2, long a3, long a4)
11897977Shsul@eecs.umich.edu{
11907978Sbinkertn@umich.edu   long i;
11917977Shsul@eecs.umich.edu   switch (a0) {
11927978Sbinkertn@umich.edu   case CONSCB_GETC:
11937981Sbinkertn@umich.edu     return GetChar();
11947978Sbinkertn@umich.edu
11957977Shsul@eecs.umich.edu   case CONSCB_PUTS:
11967981Sbinkertn@umich.edu      for(i = 0; i < a3; i++)
11977982Ssaidi@eecs.umich.edu         PutChar(*((char *)a2+i));
11987977Shsul@eecs.umich.edu      return a3;
11997978Sbinkertn@umich.edu
12007977Shsul@eecs.umich.edu   case CONSCB_GETENV:
12017979Sbinkertn@umich.edu     if (a1 >= 0 && a1 < MAX_ENV_INDEX && env_ptr[a1] != 0 && *env_ptr[a1]) {
12027979Sbinkertn@umich.edu         i = strcpy((char*)a2, env_ptr[a1]);
12037979Sbinkertn@umich.edu     } else {
12047979Sbinkertn@umich.edu         strcpy((char*)a2, "");
12057979Sbinkertn@umich.edu         i = (long)0xc000000000000000;
12067979Sbinkertn@umich.edu         if (a1 >= 0 && a1 < MAX_ENV_INDEX)
12078009Ssaidi@eecs.umich.edu             printf_lock("GETENV unsupported option %d (0x%x)\n", a1, a1);
12087979Sbinkertn@umich.edu         else
12098009Ssaidi@eecs.umich.edu             printf_lock("GETENV unsupported option %s\n", a1);
12107979Sbinkertn@umich.edu     }
12117978Sbinkertn@umich.edu
12127979Sbinkertn@umich.edu     if (i > a3)
12137979Sbinkertn@umich.edu         panic("CONSCB_GETENV overwrote buffer\n");
12147979Sbinkertn@umich.edu     return i;
12157978Sbinkertn@umich.edu
12167977Shsul@eecs.umich.edu   case CONSCB_OPEN:
12177977Shsul@eecs.umich.edu      bcopy((char*)a1,deviceState[numOpenDevices].name,a2);
12187977Shsul@eecs.umich.edu      deviceState[numOpenDevices].name[a2] = '\0';
12198009Ssaidi@eecs.umich.edu      printf_lock("CONSOLE OPEN : %s --> success \n",
12207977Shsul@eecs.umich.edu             deviceState[numOpenDevices].name);
12217977Shsul@eecs.umich.edu      return numOpenDevices++;
12227977Shsul@eecs.umich.edu
12237977Shsul@eecs.umich.edu   case CONSCB_READ:
12247977Shsul@eecs.umich.edu      DeviceOperation(a0,a1,a2,a3,a4);
12257977Shsul@eecs.umich.edu      break;
12267979Sbinkertn@umich.edu
12277977Shsul@eecs.umich.edu   case CONSCB_CLOSE:
12287977Shsul@eecs.umich.edu      break;
12297982Ssaidi@eecs.umich.edu   case CONSCB_OPEN_CONSOLE:
12308009Ssaidi@eecs.umich.edu      printf_lock("CONSOLE OPEN\n");
12317982Ssaidi@eecs.umich.edu      return 0; /* success */
12327982Ssaidi@eecs.umich.edu      break; /* not rearched */
12337982Ssaidi@eecs.umich.edu   case CONSCB_CLOSE_CONSOLE:
12348009Ssaidi@eecs.umich.edu      printf_lock("CONSOLE CLOSE\n");
12357982Ssaidi@eecs.umich.edu      return 0; /* success */
12367982Ssaidi@eecs.umich.edu      break; /* not reached */
12377979Sbinkertn@umich.edu
12387977Shsul@eecs.umich.edu   default:
12397979Sbinkertn@umich.edu      panic("cher (%x,%x,%x,%x)\n", a0, a1, a2, a3);
12407977Shsul@eecs.umich.edu   }
12417979Sbinkertn@umich.edu
12427977Shsul@eecs.umich.edu   return 0;
12437977Shsul@eecs.umich.edu}
12447977Shsul@eecs.umich.edu
12457977Shsul@eecs.umich.edulong CallBackFixup(int a0, int a1, int a2)
12467977Shsul@eecs.umich.edu{
12477985Ssaidi@eecs.umich.edu   long temp;
12487985Ssaidi@eecs.umich.edu   /* Linux uses r8 for the current pointer (pointer to data structure
12497985Ssaidi@eecs.umich.edu      contating info about currently running process). It is set when the
12507985Ssaidi@eecs.umich.edu      kernel starts and is expected to remain there... Problem is that the
12517985Ssaidi@eecs.umich.edu      unlike the kernel, the console does not prevent the assembler from
12527985Ssaidi@eecs.umich.edu      using r8. So here is a work around. So far this has only been a problem
12537985Ssaidi@eecs.umich.edu      in CallBackFixup() but any other call back functions could cause a problem
12547985Ssaidi@eecs.umich.edu      at some point */
12557985Ssaidi@eecs.umich.edu
12567985Ssaidi@eecs.umich.edu   /* save off the current pointer to a temp variable */
12577985Ssaidi@eecs.umich.edu   asm("bis $8, $31, %0" : "=r" (temp));
12587985Ssaidi@eecs.umich.edu
12597985Ssaidi@eecs.umich.edu   /* call original code */
12608009Ssaidi@eecs.umich.edu   printf_lock("CallbackFixup %x %x, t7=%x\n",a0,a1,temp);
12617985Ssaidi@eecs.umich.edu
12627985Ssaidi@eecs.umich.edu   /* restore the current pointer */
12637985Ssaidi@eecs.umich.edu   asm("bis %0, $31, $8" : : "r" (temp) : "$8");
12647977Shsul@eecs.umich.edu
12657977Shsul@eecs.umich.edu#if 0
12667977Shsul@eecs.umich.edu  if (first[FIRST(a1)]==0) {
12677977Shsul@eecs.umich.edu      first[FIRST(a1)] = KPTE(PFN(reservedFixup));
12687977Shsul@eecs.umich.edu   } else {
12697977Shsul@eecs.umich.edu      panic("CallBakcfixup\n");
12707977Shsul@eecs.umich.edu   }
12717977Shsul@eecs.umich.edu   second[SECOND(a1)] = KPTE(PFN(third_rpb));	/* Region 0 */
12727977Shsul@eecs.umich.edu   printf("Fixup: FISRT(a1)=0x%x SECOND(a1)=0x%x THIRD(a1)=0x%x\n",
12737977Shsul@eecs.umich.edu          FIRST(a1),SECOND(a1),THIRD(a1));
12747977Shsul@eecs.umich.edu
12757977Shsul@eecs.umich.edu#endif
12767977Shsul@eecs.umich.edu   return 0;
12777977Shsul@eecs.umich.edu}
12787977Shsul@eecs.umich.edu
12797977Shsul@eecs.umich.edu
12807977Shsul@eecs.umich.edu
12817977Shsul@eecs.umich.edu
12827977Shsul@eecs.umich.edu
12837977Shsul@eecs.umich.eduvoid SlaveCmd(int cpu, struct rpb_percpu *my_rpb)
12847977Shsul@eecs.umich.edu{
12857977Shsul@eecs.umich.edu/*   extern void palJToSlave[]; */
12867977Shsul@eecs.umich.edu   extern unsigned int palJToSlave[];
12877977Shsul@eecs.umich.edu
12888009Ssaidi@eecs.umich.edu   printf_lock("Slave CPU %d console command %s", cpu,my_rpb->rpb_iccb.iccb_rxbuf);
12897977Shsul@eecs.umich.edu
12907977Shsul@eecs.umich.edu   my_rpb->rpb_state |= STATE_BIP;
12917977Shsul@eecs.umich.edu   my_rpb->rpb_state &= ~STATE_RC;
12927977Shsul@eecs.umich.edu
12938009Ssaidi@eecs.umich.edu   printf_lock("SlaveCmd: restart %x %x vptb %x my_rpb %x my_rpb_phys %x\n",
12947977Shsul@eecs.umich.edu          rpb->rpb_restart,
12957977Shsul@eecs.umich.edu          rpb->rpb_restart_pv,
12967977Shsul@eecs.umich.edu          rpb->rpb_vptb, my_rpb,
12977977Shsul@eecs.umich.edu          KSEG_TO_PHYS(my_rpb));
12987977Shsul@eecs.umich.edu
12997977Shsul@eecs.umich.edu   cServe(KSEG_TO_PHYS((ul)palJToSlave),
13007977Shsul@eecs.umich.edu          (ul)rpb->rpb_restart,
13017977Shsul@eecs.umich.edu          CSERVE_K_JTOPAL,
13027977Shsul@eecs.umich.edu          rpb->rpb_restart_pv,
13037977Shsul@eecs.umich.edu          rpb->rpb_vptb,
13047977Shsul@eecs.umich.edu          KSEG_TO_PHYS(my_rpb));
13058004Ssaidi@eecs.umich.edu
13068004Ssaidi@eecs.umich.edu   panic("SlaveCmd returned \n");
13077977Shsul@eecs.umich.edu}
13087977Shsul@eecs.umich.edu
13097977Shsul@eecs.umich.eduvoid SlaveLoop( int cpu)
13107977Shsul@eecs.umich.edu{
13117977Shsul@eecs.umich.edu   int size = ROUNDUP128(sizeof(struct rpb_percpu));
13127977Shsul@eecs.umich.edu   struct rpb_percpu *my_rpb = (struct rpb_percpu*)
13137977Shsul@eecs.umich.edu      ((ul)rpb_percpu + size*cpu);
13147977Shsul@eecs.umich.edu
13157977Shsul@eecs.umich.edu   if (cpu==0) {
13167977Shsul@eecs.umich.edu      panic("CPU�0 entering slaveLoop. Reenetering the console. HOSED \n");
13177977Shsul@eecs.umich.edu   } else {
13188009Ssaidi@eecs.umich.edu      printf_lock("Entering slaveloop for cpu %d my_rpb=%x \n",cpu,my_rpb);
13197977Shsul@eecs.umich.edu   }
13208004Ssaidi@eecs.umich.edu
13218004Ssaidi@eecs.umich.edu   // swap the processors context to the one in the
13228004Ssaidi@eecs.umich.edu   // rpb_percpu struct very carefully (i.e. no stack usage)
13238004Ssaidi@eecs.umich.edu   // so that linux knows which processor ends up in __smp_callin
13248004Ssaidi@eecs.umich.edu   // and we don't trash any data is the process
13258004Ssaidi@eecs.umich.edu   SlaveSpin(cpu,my_rpb,&my_rpb->rpb_iccb.iccb_rxlen);
13267977Shsul@eecs.umich.edu}
1327