console.c revision 7985
17977Shsul@eecs.umich.edu
27977Shsul@eecs.umich.edu
37977Shsul@eecs.umich.edu/* ******************************************
47977Shsul@eecs.umich.edu * SimOS SRM  Console
57977Shsul@eecs.umich.edu *
67977Shsul@eecs.umich.edu * Derived from Lance Berc's SRM console
77977Shsul@eecs.umich.edu * for the SRC XXM�Machine
87977Shsul@eecs.umich.edu * ******************************************/
97977Shsul@eecs.umich.edu
107977Shsul@eecs.umich.edu
117981Sbinkertn@umich.edutypedef unsigned long long uint64_t;
127977Shsul@eecs.umich.edutypedef unsigned long long uint64;
137981Sbinkertn@umich.edutypedef unsigned int uint32_t;
147978Sbinkertn@umich.edutypedef unsigned int uint32;
157978Sbinkertn@umich.edu
167978Sbinkertn@umich.edu#define CONSOLE
177978Sbinkertn@umich.edu#include "alpha_access.h"
187977Shsul@eecs.umich.edu#include "machine_defs.h"
197978Sbinkertn@umich.edu
207978Sbinkertn@umich.edu#if 0
217977Shsul@eecs.umich.edu#include "new_aouthdr.h"
227977Shsul@eecs.umich.edu#include "srcmax.h"
237977Shsul@eecs.umich.edu#endif
247977Shsul@eecs.umich.edu
257977Shsul@eecs.umich.edu/* from ../h */
267977Shsul@eecs.umich.edu#include "lib.h"
277977Shsul@eecs.umich.edu#include "rpb.h"
287977Shsul@eecs.umich.edu#include "cserve.h"
297977Shsul@eecs.umich.edu
307977Shsul@eecs.umich.edu#define CONS_INT_TX   0x01  /* interrupt enable / state bits */
317977Shsul@eecs.umich.edu#define CONS_INT_RX   0x02
327977Shsul@eecs.umich.edu
337977Shsul@eecs.umich.edu#define KSEG   0xfffffc0000000000
347977Shsul@eecs.umich.edu#define K1BASE 0xfffffc8000000000
357977Shsul@eecs.umich.edu#define KSEG_TO_PHYS(x)(((ul)x) & ~KSEG)
367977Shsul@eecs.umich.edu
377977Shsul@eecs.umich.edu#define CDR ((volatile DevConsoleRegisters *) \
387977Shsul@eecs.umich.edu             (__MAGIC_ZONE(0, 0, MAGIC_ZONE_BDOOR_DEV) + __MAGIC_BDOOR_CNSLE_OFFS))
397977Shsul@eecs.umich.edu
407977Shsul@eecs.umich.edu
417977Shsul@eecs.umich.edu#define PHYS_TO_K1(_x) (K1BASE|(_x))
427977Shsul@eecs.umich.edu
437977Shsul@eecs.umich.edu#define AOUT_LOAD_ADDR (KSEG|0xf000)
447977Shsul@eecs.umich.edu
457977Shsul@eecs.umich.edu#define ROUNDUP8(x) ((ul)(((ul)x)+7) & ~7)
467977Shsul@eecs.umich.edu#define ROUNDUP128(x) ((ul)(((ul)x)+127) & ~127)
477977Shsul@eecs.umich.edu#define ROUNDUP8K(x) ((ul)(((ul)(x))+8191) & ~8191)
487977Shsul@eecs.umich.edu
497977Shsul@eecs.umich.edu#define FIRST(x)  ((((ul)(x)) >> 33) & 0x3ff)
507977Shsul@eecs.umich.edu#define SECOND(x) ((((ul)(x)) >> 23) & 0x3ff)
517977Shsul@eecs.umich.edu#define THIRD(x) ((((ul)(x)) >> 13) & 0x3ff)
527977Shsul@eecs.umich.edu#define THIRD_XXX(x)  ((((ul)(x)) >> 13) & 0xfff)
537977Shsul@eecs.umich.edu#define PFN(x)  ((((ul)(x) & ~KSEG) >> 13))
547977Shsul@eecs.umich.edu
557977Shsul@eecs.umich.edu/* Kernel write | kernel read | valid */
567977Shsul@eecs.umich.edu#define KPTE(x) ((ul)((((ul)(x)) << 32) | 0x1101))
577977Shsul@eecs.umich.edu
587977Shsul@eecs.umich.edu#define HWRPB_PAGES 4
597977Shsul@eecs.umich.edu#define MDT_BITMAP_PAGES  4
607977Shsul@eecs.umich.edu
617977Shsul@eecs.umich.edu#define CSERVE_K_JTOKERN       0x18
627977Shsul@eecs.umich.edu
637977Shsul@eecs.umich.edu#define NUM_KERNEL_THIRD (4)
647977Shsul@eecs.umich.edu
657977Shsul@eecs.umich.edu
667977Shsul@eecs.umich.edustatic unixBoot(int go, int argc, char **argv);
677977Shsul@eecs.umich.eduvoid jToPal(ul bootadr);
687977Shsul@eecs.umich.eduvoid SlaveLoop(int cpu);
697977Shsul@eecs.umich.edu
707977Shsul@eecs.umich.edu
717978Sbinkertn@umich.edustruct AlphaAccess simosConf;
727977Shsul@eecs.umich.edu
737977Shsul@eecs.umich.edu/* **************************************************************
747977Shsul@eecs.umich.edu * Console callbacks use VMS calling conventions
757977Shsul@eecs.umich.edu * read AXP manual, 2-64.
767977Shsul@eecs.umich.edu * ***************************************************************/
777977Shsul@eecs.umich.edutypedef struct OpenVMSFunc {
787977Shsul@eecs.umich.edu   long dummy;
797977Shsul@eecs.umich.edu   long func;
807977Shsul@eecs.umich.edu}OpenVMSFunc;
817977Shsul@eecs.umich.edu
827977Shsul@eecs.umich.eduOpenVMSFunc callbackFunc, fixupFunc;
837977Shsul@eecs.umich.edu
847977Shsul@eecs.umich.edu
857977Shsul@eecs.umich.edu
867977Shsul@eecs.umich.edu
877977Shsul@eecs.umich.eduul theLock;
887977Shsul@eecs.umich.edu
897977Shsul@eecs.umich.edu
907977Shsul@eecs.umich.eduextern void SpinLock(ul *lock);
917977Shsul@eecs.umich.edu#define SpinUnlock(_x) *(_x) = 0;
927977Shsul@eecs.umich.edu
937977Shsul@eecs.umich.edustruct _kernel_params {
947977Shsul@eecs.umich.edu   char *bootadr;
957977Shsul@eecs.umich.edu   ul rpb_percpu;
967977Shsul@eecs.umich.edu   ul free_pfn;
977977Shsul@eecs.umich.edu   ul argc;
987977Shsul@eecs.umich.edu   ul argv;
997977Shsul@eecs.umich.edu   ul envp; /* NULL */
1007977Shsul@eecs.umich.edu};
1017977Shsul@eecs.umich.edu
1027977Shsul@eecs.umich.edu
1037977Shsul@eecs.umich.eduextern consoleCallback[];
1047977Shsul@eecs.umich.eduextern consoleFixup[];
1057977Shsul@eecs.umich.edulong CallBackDispatcher();
1067977Shsul@eecs.umich.edulong CallBackFixup();
1077977Shsul@eecs.umich.edu
1087977Shsul@eecs.umich.edu/*
1097977Shsul@eecs.umich.edu * simos console output
1107977Shsul@eecs.umich.edu */
1117977Shsul@eecs.umich.edu
1127977Shsul@eecs.umich.eduvoid InitConsole(void)
1137977Shsul@eecs.umich.edu{
1147977Shsul@eecs.umich.edu#if 0
1157977Shsul@eecs.umich.edu   CDR->intr_status =(DevRegister)(DEV_CNSLE_RX_INTR |DEV_CNSLE_TX_INTR);
1167977Shsul@eecs.umich.edu#endif
1177977Shsul@eecs.umich.edu}
1187977Shsul@eecs.umich.edu
1197978Sbinkertn@umich.educhar GetChar()
1207978Sbinkertn@umich.edu{
1217978Sbinkertn@umich.edu   struct AlphaAccess *k1Conf = (struct AlphaAccess *)(__MAGIC_ZONE(0, 0, MAGIC_ZONE_EV5_ALIAS));
1227981Sbinkertn@umich.edu   return k1Conf->inputChar;
1237978Sbinkertn@umich.edu}
1247978Sbinkertn@umich.edu
1257977Shsul@eecs.umich.eduvoid PutChar(char c)
1267977Shsul@eecs.umich.edu{
1277977Shsul@eecs.umich.edu#if 0
1287977Shsul@eecs.umich.edu   CDR->data = c;
1297977Shsul@eecs.umich.edu#endif
1307977Shsul@eecs.umich.edu#if 0
1317977Shsul@eecs.umich.edu   *(int*) PHYS_TO_K1(SLOT_D_COM1<<5) = c;
1327977Shsul@eecs.umich.edu#endif
1337978Sbinkertn@umich.edu   struct AlphaAccess *k1Conf = (struct AlphaAccess *)(__MAGIC_ZONE(0, 0, MAGIC_ZONE_EV5_ALIAS));
1347977Shsul@eecs.umich.edu   k1Conf->outputChar = c;
1357977Shsul@eecs.umich.edu
1367977Shsul@eecs.umich.edu}
1377977Shsul@eecs.umich.edu
1387977Shsul@eecs.umich.edu
1397978Sbinkertn@umich.eduint
1407978Sbinkertn@umich.edupassArgs(int argc)
1417978Sbinkertn@umich.edu{ return 0; }
1427977Shsul@eecs.umich.edu
1437978Sbinkertn@umich.eduint
1447977Shsul@eecs.umich.edumain(int argc, char **argv)
1457977Shsul@eecs.umich.edu{
1467977Shsul@eecs.umich.edu   int x,i;
1477978Sbinkertn@umich.edu   struct AlphaAccess *k1Conf = (struct AlphaAccess *)(__MAGIC_ZONE(0, 0, MAGIC_ZONE_EV5_ALIAS));
1487977Shsul@eecs.umich.edu   ui *k1ptr,*ksegptr;
1497977Shsul@eecs.umich.edu
1507977Shsul@eecs.umich.edu
1517977Shsul@eecs.umich.edu   InitConsole();
1527977Shsul@eecs.umich.edu   printf("SimOS console \n");
1537977Shsul@eecs.umich.edu   /*
1547977Shsul@eecs.umich.edu    * get configuration from backdoor
1557977Shsul@eecs.umich.edu    */
1567977Shsul@eecs.umich.edu   simosConf.last_offset = k1Conf->last_offset;
1577977Shsul@eecs.umich.edu   printf(" Got simosConfiguration %d \n",simosConf.last_offset);
1587977Shsul@eecs.umich.edu
1597977Shsul@eecs.umich.edu   for (i=1;i<=simosConf.last_offset/4;i++) {
1607977Shsul@eecs.umich.edu      ui *k1ptr = (ui*)k1Conf + i;
1617977Shsul@eecs.umich.edu      ui *ksegptr = (ui*)(&simosConf.last_offset)+i;
1627977Shsul@eecs.umich.edu      *ksegptr = *k1ptr;
1637977Shsul@eecs.umich.edu
1647977Shsul@eecs.umich.edu   }
1657977Shsul@eecs.umich.edu
1667977Shsul@eecs.umich.edu   if (simosConf.version != ALPHA_ACCESS_VERSION)  {
1677977Shsul@eecs.umich.edu      panic("Console version mismatch. Console expects %d. SimOS has %d \n",
1687977Shsul@eecs.umich.edu            ALPHA_ACCESS_VERSION,simosConf.version);
1697977Shsul@eecs.umich.edu   }
1707977Shsul@eecs.umich.edu
1717977Shsul@eecs.umich.edu
1727977Shsul@eecs.umich.edu   /*
1737977Shsul@eecs.umich.edu    * setup arguments to kernel
1747977Shsul@eecs.umich.edu    */
1757977Shsul@eecs.umich.edu   unixBoot(1,argc,argv);
1767977Shsul@eecs.umich.edu
1777977Shsul@eecs.umich.edu   x = *(volatile int *)(K1BASE-4);
1787977Shsul@eecs.umich.edu   while(1) continue;
1797977Shsul@eecs.umich.edu   return x;
1807977Shsul@eecs.umich.edu}
1817977Shsul@eecs.umich.edu
1827977Shsul@eecs.umich.edu/*
1837977Shsul@eecs.umich.edu * BOOTING
1847977Shsul@eecs.umich.edu */
1857977Shsul@eecs.umich.edustruct rpb xxm_rpb = {
1867977Shsul@eecs.umich.edu   NULL,		/* 000: physical self-reference */
1877978Sbinkertn@umich.edu   ((long)'H') | (((long)'W') << 8) | (((long)'R') << 16) |
1887978Sbinkertn@umich.edu   ((long)'P' << 24) | (((long)'B') << 32),  /* 008: contains string "HWRPB" */
1897977Shsul@eecs.umich.edu   6,			/* 010: HWRPB version number */
1907977Shsul@eecs.umich.edu   /* the byte count is wrong, but who needs it? - lance */
1917977Shsul@eecs.umich.edu   0,			/* 018: bytes in RPB perCPU CTB CRB MEDSC */
1927977Shsul@eecs.umich.edu   0,			/* 020: primary cpu id */
1937977Shsul@eecs.umich.edu   8192,		/* 028: page size in bytes */
1947977Shsul@eecs.umich.edu   43,		/* 030: number of phys addr bits */
1957977Shsul@eecs.umich.edu   127,		/* 038: max valid ASN */
1967977Shsul@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 */
1977977Shsul@eecs.umich.edu#ifdef undef
1987977Shsul@eecs.umich.edu/* To be legitimate, the following system type and variation are correct for the XXM.
1997977Shsul@eecs.umich.edu   But there are too many #ifdefs etc to deal with in Unix, so we tell the kernel
2007977Shsul@eecs.umich.edu   that we're an Avanti, which is similar enough.
2017977Shsul@eecs.umich.edu   */
2027977Shsul@eecs.umich.edu   31,		/* 050: system type - XXM is now in the Alpha SRM */
2037977Shsul@eecs.umich.edu   (1 << 10) | (2<<1),/* 058: system variation - XXM w/EV5 & embeded console */
2047977Shsul@eecs.umich.edu#endif
2057977Shsul@eecs.umich.edu#if 0
2067977Shsul@eecs.umich.edu   0x12,		/* 050: system type - masquarade as some random 21064 */
2077977Shsul@eecs.umich.edu#endif
2087985Ssaidi@eecs.umich.edu   34, /* masquerade a Tsunami RGD */
2097985Ssaidi@eecs.umich.edu   (1<<10),		/* 058: system variation */
2107977Shsul@eecs.umich.edu   'c'|('o'<<8)|('o'<<16)|('l'<< 24),		/* 060: system revision */
2117977Shsul@eecs.umich.edu   1024*4096,		/* 068: scaled interval clock intr freq  OVERRIDEN*/
2127977Shsul@eecs.umich.edu   0,			/* 070: cycle counter frequency */
2137977Shsul@eecs.umich.edu   0x200000000,	/* 078: virtual page table base */
2147977Shsul@eecs.umich.edu   0,			/* 080: reserved */
2157977Shsul@eecs.umich.edu   0,			/* 088: offset to translation buffer hint */
2167977Shsul@eecs.umich.edu   1,			/* 090: number of processor slots OVERRIDDEN*/
2177977Shsul@eecs.umich.edu   sizeof(struct rpb_percpu),	/* 098: per-cpu slot size. OVERRIDDEN */
2187977Shsul@eecs.umich.edu   0,			/* 0A0: offset to per_cpu slots */
2197977Shsul@eecs.umich.edu   1,			/* 0A8: number of CTBs */
2207977Shsul@eecs.umich.edu#ifdef bugnion_gone
2217977Shsul@eecs.umich.edu   sizeof(struct rpb_ctb),	/* 0B0: bytes in largest CTB */
2227977Shsul@eecs.umich.edu#else
2237977Shsul@eecs.umich.edu   sizeof(struct ctb_tt),
2247977Shsul@eecs.umich.edu#endif
2257977Shsul@eecs.umich.edu   0,			/* 0B8: offset to CTB (cons term block) */
2267977Shsul@eecs.umich.edu   0,			/* 0C0: offset to CRB (cons routine block) */
2277977Shsul@eecs.umich.edu   0,			/* 0C8: offset to memory descriptor table */
2287977Shsul@eecs.umich.edu   0,			/* 0D0: offset to config data block */
2297977Shsul@eecs.umich.edu   0,			/* 0D8: offset to FRU table */
2307977Shsul@eecs.umich.edu   0,			/* 0E0: virt addr of save term routine */
2317977Shsul@eecs.umich.edu   0,			/* 0E8: proc value for save term routine */
2327977Shsul@eecs.umich.edu   0,			/* 0F0: virt addr of restore term routine */
2337977Shsul@eecs.umich.edu   0,			/* 0F8: proc value for restore term routine */
2347977Shsul@eecs.umich.edu   0,			/* 100: virt addr of CPU restart routine */
2357977Shsul@eecs.umich.edu   0,			/* 108: proc value for CPU restart routine */
2367977Shsul@eecs.umich.edu   0,			/* 110: used to determine presence of kdebug */
2377977Shsul@eecs.umich.edu   0,			/* 118: reserved for hardware */
2387977Shsul@eecs.umich.edu/* the checksum is wrong, but who needs it? - lance */
2397977Shsul@eecs.umich.edu   0,			/* 120: checksum of prior entries in rpb */
2407977Shsul@eecs.umich.edu   0,			/* 128: receive ready bitmask */
2417977Shsul@eecs.umich.edu   0,			/* 130: transmit ready bitmask */
2427977Shsul@eecs.umich.edu   0,			/* 138: Dynamic System Recog. offset */
2437977Shsul@eecs.umich.edu};
2447977Shsul@eecs.umich.edu
2457977Shsul@eecs.umich.eduul xxm_tbb[] = { 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e,
2467977Shsul@eecs.umich.edu                 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e, 0x1e1e1e1e1e1e1e1e};
2477977Shsul@eecs.umich.edu
2487977Shsul@eecs.umich.edustruct rpb_percpu xxm_rpb_percpu = {
2497977Shsul@eecs.umich.edu   {0,0,0,0,0,0,0,{0,0},{0,0,0,0,0,0,0,0}},				/* 000: boot/restart HWPCB */
2507977Shsul@eecs.umich.edu   (STATE_PA | STATE_PP | STATE_CV | STATE_PV | STATE_PMV | STATE_PL), 	/* 080: per-cpu state bits */
2517977Shsul@eecs.umich.edu   0xc000,				/* 088: palcode memory length */
2527977Shsul@eecs.umich.edu   0x2000,				/* 090: palcode scratch length */
2537977Shsul@eecs.umich.edu   0x4000,				/* 098: phys addr of palcode mem space */
2547977Shsul@eecs.umich.edu   0x2000,				/* 0A0: phys addr of palcode scratch space */
2557977Shsul@eecs.umich.edu   (2 << 16) | (5 << 8) | 1,		/* 0A8: PALcode rev required */
2567978Sbinkertn@umich.edu   5 | (2L  << 32),				/* 0B0: processor type */
2577977Shsul@eecs.umich.edu   7,					/* 0B8: processor variation */
2587977Shsul@eecs.umich.edu   'D'|('a'<<8)|('v'<<16)|('e'<<24),	/* 0C0: processor revision */
2597977Shsul@eecs.umich.edu   {'D','a','v','e','C','o','n','r','o','y',0,0,0,0,0,0},	/* 0C8: proc serial num: 10 ascii chars */
2607977Shsul@eecs.umich.edu   0,					/* 0D8: phys addr of logout area */
2617977Shsul@eecs.umich.edu   0,					/* 0E0: length in bytes of logout area */
2627977Shsul@eecs.umich.edu   0,					/* 0E8: halt pcb base */
2637977Shsul@eecs.umich.edu   0,					/* 0F0: halt pc */
2647977Shsul@eecs.umich.edu   0,					/* 0F8: halt ps */
2657977Shsul@eecs.umich.edu   0,					/* 100: halt arg list (R25) */
2667977Shsul@eecs.umich.edu   0,					/* 108: halt return address (R26) */
2677977Shsul@eecs.umich.edu   0,					/* 110: halt procedure value (R27) */
2687977Shsul@eecs.umich.edu   0,		       			/* 118: reason for halt */
2697977Shsul@eecs.umich.edu   0,		       			/* 120: for software */
2707977Shsul@eecs.umich.edu   {0},				/* 128: inter-console communications buffer */
2717977Shsul@eecs.umich.edu   {1,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0},	/* 1D0: PALcode revs available */
2727977Shsul@eecs.umich.edu   0					/* 250: reserved for arch use */
2737977Shsul@eecs.umich.edu/* the dump stack grows from the end of the rpb page not to reach here */
2747977Shsul@eecs.umich.edu};
2757977Shsul@eecs.umich.edu
2767977Shsul@eecs.umich.edustruct _xxm_rpb_mdt {
2777977Shsul@eecs.umich.edu   long   rpb_checksum;	/* 000: checksum of entire mem desc table */
2787977Shsul@eecs.umich.edu   long   rpb_impaddr;		/* 008: PA of implementation dep info */
2797977Shsul@eecs.umich.edu   long   rpb_numcl;		/* 010: number of clusters */
2807977Shsul@eecs.umich.edu   struct rpb_cluster rpb_cluster[3];	/* first instance of a cluster */
2817977Shsul@eecs.umich.edu};
2827977Shsul@eecs.umich.edu
2837977Shsul@eecs.umich.edustruct _xxm_rpb_mdt xxm_rpb_mdt = {
2847977Shsul@eecs.umich.edu   0,		/* 000: checksum of entire mem desc table */
2857977Shsul@eecs.umich.edu   0,		/* 008: PA of implementation dep info */
2867977Shsul@eecs.umich.edu   0,		/* 010: number of clusters */
2877977Shsul@eecs.umich.edu   {{	0,		/* 000: starting PFN of this cluster */
2887977Shsul@eecs.umich.edu        0,		/* 008: count of PFNs in this cluster */
2897977Shsul@eecs.umich.edu        0,		/* 010: count of tested PFNs in cluster */
2907977Shsul@eecs.umich.edu        0,		/* 018: va of bitmap */
2917977Shsul@eecs.umich.edu        0,		/* 020: pa of bitmap */
2927977Shsul@eecs.umich.edu        0,		/* 028: checksum of bitmap */
2937977Shsul@eecs.umich.edu        1		/* 030: usage of cluster */
2947977Shsul@eecs.umich.edu   },
2957977Shsul@eecs.umich.edu    {   0,		/* 000: starting PFN of this cluster */
2967977Shsul@eecs.umich.edu        0,		/* 008: count of PFNs in this cluster */
2977977Shsul@eecs.umich.edu        0,		/* 010: count of tested PFNs in cluster */
2987977Shsul@eecs.umich.edu        0,		/* 018: va of bitmap */
2997977Shsul@eecs.umich.edu        0,		/* 020: pa of bitmap */
3007977Shsul@eecs.umich.edu        0,		/* 028: checksum of bitmap */
3017977Shsul@eecs.umich.edu        0		/* 030: usage of cluster */
3027977Shsul@eecs.umich.edu    },
3037977Shsul@eecs.umich.edu    {   0,		/* 000: starting PFN of this cluster */
3047977Shsul@eecs.umich.edu        0,		/* 008: count of PFNs in this cluster */
3057977Shsul@eecs.umich.edu        0,		/* 010: count of tested PFNs in cluster */
3067977Shsul@eecs.umich.edu        0,		/* 018: va of bitmap */
3077977Shsul@eecs.umich.edu        0,		/* 020: pa of bitmap */
3087977Shsul@eecs.umich.edu        0,		/* 028: checksum of bitmap */
3097977Shsul@eecs.umich.edu        0		/* 030: usage of cluster */
3107977Shsul@eecs.umich.edu    }}
3117977Shsul@eecs.umich.edu};
3127977Shsul@eecs.umich.edu
3137977Shsul@eecs.umich.edu/* constants for slotinfo bus_type subfield */
3147977Shsul@eecs.umich.edu#define SLOTINFO_TC	0
3157977Shsul@eecs.umich.edu#define SLOTINFO_ISA	1
3167977Shsul@eecs.umich.edu#define SLOTINFO_EISA	2
3177977Shsul@eecs.umich.edu#define SLOTINFO_PCI	3
3187977Shsul@eecs.umich.edu
3197977Shsul@eecs.umich.edustruct rpb_ctb xxm_rpb_ctb = {
3207977Shsul@eecs.umich.edu   CONS_DZ,	/* 000: console type */
3217977Shsul@eecs.umich.edu   0,		/* 008: console unit */
3227977Shsul@eecs.umich.edu   0,		/* 010: reserved */
3237977Shsul@eecs.umich.edu   0		/* 018: byte length of device dep portion */
3247977Shsul@eecs.umich.edu};
3257977Shsul@eecs.umich.edu
3267977Shsul@eecs.umich.edu/* we don't do any fixup (aka relocate the console) - we hope */
3277977Shsul@eecs.umich.edustruct rpb_crb xxm_rpb_crb = {
3287977Shsul@eecs.umich.edu   0,		/* va of call-back dispatch rtn */
3297977Shsul@eecs.umich.edu   0,		/* pa of call-back dispatch rtn */
3307977Shsul@eecs.umich.edu   0,		/* va of call-back fixup rtn */
3317977Shsul@eecs.umich.edu   0,		/* pa of call-back fixup rtn */
3327977Shsul@eecs.umich.edu   0,		/* number of entries in phys/virt map */
3337977Shsul@eecs.umich.edu   0		/* Number of pages to be mapped */
3347977Shsul@eecs.umich.edu};
3357977Shsul@eecs.umich.edu
3367977Shsul@eecs.umich.edustruct _rpb_name {
3377977Shsul@eecs.umich.edu   unsigned long length;
3387977Shsul@eecs.umich.edu   char name[16];
3397977Shsul@eecs.umich.edu};
3407977Shsul@eecs.umich.edu
3417977Shsul@eecs.umich.eduextern struct _rpb_name xxm_name;
3427977Shsul@eecs.umich.edu
3437977Shsul@eecs.umich.edustruct rpb_dsr xxm_rpb_dsr = {
3447977Shsul@eecs.umich.edu   0,
3457977Shsul@eecs.umich.edu   0,
3467977Shsul@eecs.umich.edu   0,
3477977Shsul@eecs.umich.edu};
3487977Shsul@eecs.umich.edu
3497977Shsul@eecs.umich.edustruct _rpb_name xxm_name = {
3507977Shsul@eecs.umich.edu   16,
3517977Shsul@eecs.umich.edu   {'D','E','C',' ','S','R','C',' ','X','X','M',' ','D','G','C',0},
3527977Shsul@eecs.umich.edu};
3537977Shsul@eecs.umich.edu
3547977Shsul@eecs.umich.edu/* XXM has one LURT entry - 1050 is for workstations, 1100 is servers (and is needed for CXX) */
3557977Shsul@eecs.umich.edulong xxm_lurt[10] = { 9, 12, -1, -1, -1, -1, -1, -1, 1100, 1100 };
3567977Shsul@eecs.umich.edu
3577977Shsul@eecs.umich.eduul unix_boot_mem;
3587977Shsul@eecs.umich.eduunsigned long bootadr;
3597977Shsul@eecs.umich.edu#if 0
3607977Shsul@eecs.umich.eduunsigned long  aout_bss_addr, aout_bss_size, aout_entry, aout_text_start, aout_data_addr;
3617977Shsul@eecs.umich.edu#endif
3627977Shsul@eecs.umich.educhar **kargv;
3637977Shsul@eecs.umich.eduint kargc;
3647977Shsul@eecs.umich.eduul free_pfn;
3657977Shsul@eecs.umich.edustruct rpb_percpu *rpb_percpu;
3667977Shsul@eecs.umich.edu
3677977Shsul@eecs.umich.edu
3687977Shsul@eecs.umich.edu#define MAX_CPUS 32
3697977Shsul@eecs.umich.edu
3707977Shsul@eecs.umich.eduul bootStrapImpure[MAX_CPUS];
3717977Shsul@eecs.umich.edu
3727977Shsul@eecs.umich.edu
3737977Shsul@eecs.umich.educhar *unix_boot_alloc(int pages)
3747977Shsul@eecs.umich.edu{
3757977Shsul@eecs.umich.edu   char *ret = (char *) unix_boot_mem;
3767977Shsul@eecs.umich.edu   unix_boot_mem += (pages * 8192);
3777977Shsul@eecs.umich.edu   return ret;
3787977Shsul@eecs.umich.edu}
3797977Shsul@eecs.umich.edu
3807977Shsul@eecs.umich.eduul *first = 0;
3817977Shsul@eecs.umich.eduul *third_rpb = 0;
3827977Shsul@eecs.umich.eduul *reservedFixup = 0;
3837977Shsul@eecs.umich.edu
3847978Sbinkertn@umich.eduint strcpy(char *dst, char *src);
3857978Sbinkertn@umich.edu
3867977Shsul@eecs.umich.edustruct rpb *rpb;
3877977Shsul@eecs.umich.edu
3887977Shsul@eecs.umich.eduunixBoot(int go, int argc, char **argv)
3897977Shsul@eecs.umich.edu{
3907977Shsul@eecs.umich.edu   ul *second,  *third_kernel, ptr, *tbb, size, *percpu_logout;
3917977Shsul@eecs.umich.edu   unsigned char *mdt_bitmap;
3927977Shsul@eecs.umich.edu   long *lp1, *lp2, sum;
3937977Shsul@eecs.umich.edu   int i, cl;
3947977Shsul@eecs.umich.edu   int kern_first_page;
3957977Shsul@eecs.umich.edu   int mem_size = simosConf.mem_size;
3967977Shsul@eecs.umich.edu
3977977Shsul@eecs.umich.edu   int mem_pages = mem_size / 8192, cons_pages;
3987977Shsul@eecs.umich.edu   ul kernel_bytes, ksp, kernel_end, *unix_kernel_stack, bss, ksp_bottom, ksp_top;
3997977Shsul@eecs.umich.edu   struct rpb_ctb *rpb_ctb;
4007977Shsul@eecs.umich.edu   struct ctb_tt *ctb_tt;
4017977Shsul@eecs.umich.edu   struct rpb_dsr *rpb_dsr;
4027977Shsul@eecs.umich.edu   struct rpb_crb *rpb_crb;
4037977Shsul@eecs.umich.edu   struct _xxm_rpb_mdt *rpb_mdt;
4047977Shsul@eecs.umich.edu   int *rpb_lurt;
4057977Shsul@eecs.umich.edu   char *rpb_name;
4067977Shsul@eecs.umich.edu   ul nextPtr;
4077977Shsul@eecs.umich.edu
4087977Shsul@eecs.umich.edu   printf( "memsize %x pages %x \n",mem_size,mem_pages);
4097977Shsul@eecs.umich.edu
4107977Shsul@eecs.umich.edu
4117977Shsul@eecs.umich.edu
4127977Shsul@eecs.umich.edu#ifdef notnow
4137977Shsul@eecs.umich.edu   if (unixArgs()) return;
4147977Shsul@eecs.umich.edu#endif
4157977Shsul@eecs.umich.edu
4167977Shsul@eecs.umich.edu   /* Allocate:
4177977Shsul@eecs.umich.edu    *   two pages for the HWRPB
4187977Shsul@eecs.umich.edu    *   five page table pages:
4197977Shsul@eecs.umich.edu    *     1: First level page table
4207977Shsul@eecs.umich.edu    *     1: Second level page table
4217977Shsul@eecs.umich.edu    *     1: Third level page table for HWRPB
4227977Shsul@eecs.umich.edu    *     2: Third level page table for kernel (for up to 16MB)
4237977Shsul@eecs.umich.edu    * set up the page tables
4247977Shsul@eecs.umich.edu    * load the kernel at the physical address 0x230000
4257977Shsul@eecs.umich.edu    * build the HWRPB
4267977Shsul@eecs.umich.edu    *   set up memory descriptor table to give up the
4277977Shsul@eecs.umich.edu    *   physical memory between the end of the page
4287977Shsul@eecs.umich.edu    *   tables and the start of the kernel
4297977Shsul@eecs.umich.edu    * enable kseg addressing
4307977Shsul@eecs.umich.edu    * jump to the kernel
4317977Shsul@eecs.umich.edu    */
4327977Shsul@eecs.umich.edu
4337977Shsul@eecs.umich.edu   unix_boot_mem = ROUNDUP8K(&_end);
4347977Shsul@eecs.umich.edu
4357977Shsul@eecs.umich.edu   printf("First free page after ROM 0x%x\n", unix_boot_mem);
4367977Shsul@eecs.umich.edu
4377977Shsul@eecs.umich.edu   rpb = (struct rpb *) unix_boot_alloc( HWRPB_PAGES);
4387977Shsul@eecs.umich.edu
4397977Shsul@eecs.umich.edu   mdt_bitmap =  (unsigned char *) unix_boot_alloc(MDT_BITMAP_PAGES);
4407977Shsul@eecs.umich.edu   first = (ul *)unix_boot_alloc(1);
4417977Shsul@eecs.umich.edu   second = (ul *)unix_boot_alloc(1);
4427977Shsul@eecs.umich.edu   third_rpb = (ul *)unix_boot_alloc(1);
4437977Shsul@eecs.umich.edu   reservedFixup = (ul*) unix_boot_alloc(1);
4447977Shsul@eecs.umich.edu   third_kernel = (ul *)unix_boot_alloc(NUM_KERNEL_THIRD);
4457977Shsul@eecs.umich.edu   percpu_logout = (ul*)unix_boot_alloc(1);
4467977Shsul@eecs.umich.edu
4477977Shsul@eecs.umich.edu
4487977Shsul@eecs.umich.edu   cons_pages = KSEG_TO_PHYS(unix_boot_mem) / 8192;
4497977Shsul@eecs.umich.edu
4507977Shsul@eecs.umich.edu   /* Set up the page tables */
4517977Shsul@eecs.umich.edu   bzero((char *)first, 8192);
4527977Shsul@eecs.umich.edu   bzero((char *)second, 8192);
4537977Shsul@eecs.umich.edu   bzero((char *)reservedFixup,8192);
4547977Shsul@eecs.umich.edu   bzero((char *)third_rpb, HWRPB_PAGES * 8192);
4557977Shsul@eecs.umich.edu   bzero((char *)third_kernel, 8192 * NUM_KERNEL_THIRD);
4567977Shsul@eecs.umich.edu
4577977Shsul@eecs.umich.edu   first[0] = KPTE(PFN(second));
4587977Shsul@eecs.umich.edu   first[1] = KPTE(PFN(first)); /* Region 3 */
4597977Shsul@eecs.umich.edu
4607977Shsul@eecs.umich.edu   second[SECOND(0x10000000)] = KPTE(PFN(third_rpb));	/* Region 0 */
4617977Shsul@eecs.umich.edu   for (i=0;i<NUM_KERNEL_THIRD;i++) {
4627977Shsul@eecs.umich.edu      second[SECOND(0x20000000)+i] = KPTE(PFN(third_kernel)+i);	/* Region 1 */
4637977Shsul@eecs.umich.edu   }
4647977Shsul@eecs.umich.edu   second[SECOND(0x40000000)] = KPTE(PFN(second));	/* Region 2 */
4657977Shsul@eecs.umich.edu
4667977Shsul@eecs.umich.edu
4677977Shsul@eecs.umich.edu   {
4687977Shsul@eecs.umich.edu
4697977Shsul@eecs.umich.edu      /* For some obscure reason, Dec Unix's database read
4707977Shsul@eecs.umich.edu       * from /etc/sysconfigtab is written to this fixed
4717977Shsul@eecs.umich.edu       * mapped memory location. Go figure, since it is
4727977Shsul@eecs.umich.edu       * not initialized by the console. Maybe it is
4737977Shsul@eecs.umich.edu       * to look at the database from the console
4747977Shsul@eecs.umich.edu       * after a boot/crash.
4757977Shsul@eecs.umich.edu       *
4767977Shsul@eecs.umich.edu       * Black magic to estimate the max size. SEGVs on overflow
4777977Shsul@eecs.umich.edu       * bugnion
4787977Shsul@eecs.umich.edu       */
4797977Shsul@eecs.umich.edu
4807977Shsul@eecs.umich.edu#define DATABASE_BASE           0x20000000
4817977Shsul@eecs.umich.edu#ifdef not_not
4827977Shsul@eecs.umich.edu#define DATABASE_END            0x20230000 /* don't need all that */
4837977Shsul@eecs.umich.edu#endif
4847977Shsul@eecs.umich.edu
4857977Shsul@eecs.umich.edu#define DATABASE_END            0x20020000
4867977Shsul@eecs.umich.edu
4877977Shsul@eecs.umich.edu      int i;
4887977Shsul@eecs.umich.edu      ul *dbPage = (ul*)unix_boot_alloc(1);
4897977Shsul@eecs.umich.edu      second[SECOND(DATABASE_BASE)] = KPTE(PFN(dbPage));
4907977Shsul@eecs.umich.edu      for (i=DATABASE_BASE; i <DATABASE_END ; i+= 8096) {
4917977Shsul@eecs.umich.edu         ul *db = (ul*)unix_boot_alloc(1);
4927977Shsul@eecs.umich.edu         dbPage[THIRD(i)] = KPTE(PFN(db));
4937977Shsul@eecs.umich.edu      }
4947977Shsul@eecs.umich.edu   }
4957977Shsul@eecs.umich.edu
4967977Shsul@eecs.umich.edu   /* Region 0 */
4977977Shsul@eecs.umich.edu   /* Map the HWRPB */
4987977Shsul@eecs.umich.edu   for (i = 0; i < HWRPB_PAGES; i++) third_rpb[i] = KPTE(PFN(rpb) + i);
4997977Shsul@eecs.umich.edu
5007977Shsul@eecs.umich.edu   /* Map the MDT bitmap table */
5017977Shsul@eecs.umich.edu   for (i=0;i<MDT_BITMAP_PAGES;i++) {
5027977Shsul@eecs.umich.edu      third_rpb[HWRPB_PAGES+i] = KPTE(PFN(mdt_bitmap)+i);
5037977Shsul@eecs.umich.edu   }
5047977Shsul@eecs.umich.edu
5057977Shsul@eecs.umich.edu   /* Protect the PAL pages */
5067977Shsul@eecs.umich.edu   for (i = 1; i < PFN(first); i++) third_rpb[HWRPB_PAGES + MDT_BITMAP_PAGES + i] = KPTE(i);
5077977Shsul@eecs.umich.edu
5087977Shsul@eecs.umich.edu   /* Set up third_kernel after it's loaded, when we know where it is */
5097977Shsul@eecs.umich.edu
5107977Shsul@eecs.umich.edu#ifdef original__xxm
5117977Shsul@eecs.umich.edu   if (unixLoadKernel(AOUT_LOAD_ADDR, argv[1]) == -1) return;
5127977Shsul@eecs.umich.edu   aoutfixup(AOUT_LOAD_ADDR);
5137977Shsul@eecs.umich.edu#else
5147977Shsul@eecs.umich.edu   /* aoutfixup(simosConf.kernelFileHdr); */
5157977Shsul@eecs.umich.edu#endif
5167977Shsul@eecs.umich.edu#if 0
5177977Shsul@eecs.umich.edu   bss = aout_bss_addr;
5187977Shsul@eecs.umich.edu
5197977Shsul@eecs.umich.edu   kern_first_page = (KSEG_TO_PHYS(aout_text_start) / 8192);
5207977Shsul@eecs.umich.edu   kernel_end = ksp_top = ROUNDUP8K(aout_bss_addr + aout_bss_size);
5217977Shsul@eecs.umich.edu   bootadr = aout_entry;
5227977Shsul@eecs.umich.edu#endif
5237977Shsul@eecs.umich.edu
5247977Shsul@eecs.umich.edu   kern_first_page = (KSEG_TO_PHYS(simosConf.kernStart)/8192);
5257977Shsul@eecs.umich.edu   kernel_end = ksp_top = ROUNDUP8K(simosConf.kernEnd);
5267977Shsul@eecs.umich.edu   bootadr = simosConf.entryPoint;
5277977Shsul@eecs.umich.edu
5287977Shsul@eecs.umich.edu
5297977Shsul@eecs.umich.edu   printf("HWRPB 0x%x l1pt 0x%x l2pt 0x%x l3pt_rpb 0x%x l3pt_kernel 0x%x l2reserv 0x%x\n",
5307977Shsul@eecs.umich.edu          rpb, first, second, third_rpb, third_kernel,reservedFixup);
5317977Shsul@eecs.umich.edu   if (kernel_end - simosConf.kernStart > (0x800000*NUM_KERNEL_THIRD)) {
5327977Shsul@eecs.umich.edu      printf("Kernel is more than 8MB 0x%x - 0x%x = 0x%x\n",
5337977Shsul@eecs.umich.edu             kernel_end, simosConf.kernStart,
5347977Shsul@eecs.umich.edu             kernel_end -simosConf.kernStart );
5357977Shsul@eecs.umich.edu      panic("kernel too big\n");
5367977Shsul@eecs.umich.edu
5377977Shsul@eecs.umich.edu   }
5387977Shsul@eecs.umich.edu   /* Map the kernel's pages into the third level of region 2 */
5397977Shsul@eecs.umich.edu
5407977Shsul@eecs.umich.edu   for (ptr = simosConf.kernStart; ptr < kernel_end; ptr += 8192) {
5417977Shsul@eecs.umich.edu
5427977Shsul@eecs.umich.edu      third_kernel[THIRD_XXX(ptr)] = KPTE(PFN(ptr));
5437977Shsul@eecs.umich.edu   }
5447977Shsul@eecs.umich.edu   /* blow 2 pages of phys mem for guards since it maintains 1-to-1 mapping */
5457977Shsul@eecs.umich.edu   ksp = ksp_top + (3 * 8192);
5467977Shsul@eecs.umich.edu   if (ksp - simosConf.kernStart > (0x800000*NUM_KERNEL_THIRD)) {
5477977Shsul@eecs.umich.edu      printf("Kernel stack pushd us over 8MB\n");
5487977Shsul@eecs.umich.edu      panic("ksp too big\n");
5497977Shsul@eecs.umich.edu   }
5507977Shsul@eecs.umich.edu   if (THIRD_XXX((ul)ksp_top) >  NUM_KERNEL_THIRD * 1024) {
5517977Shsul@eecs.umich.edu      panic("increase NUM_KERNEL_THIRD, and change THIRD_XXX\n");
5527977Shsul@eecs.umich.edu   }
5537977Shsul@eecs.umich.edu   ptr = (ul) ksp_top;
5547977Shsul@eecs.umich.edu   bzero((char *)ptr, 8192 * 2);
5557977Shsul@eecs.umich.edu   third_kernel[THIRD_XXX(ptr)] = 0;			/* Stack Guard Page */
5567977Shsul@eecs.umich.edu   ptr += 8192;
5577977Shsul@eecs.umich.edu   third_kernel[THIRD_XXX(ptr)] = KPTE(PFN(ptr));	/* Kernel Stack Pages */
5587977Shsul@eecs.umich.edu   ptr += 8192;
5597977Shsul@eecs.umich.edu   third_kernel[THIRD_XXX(ptr)] = KPTE(PFN(ptr));
5607977Shsul@eecs.umich.edu   ptr += 8192;
5617977Shsul@eecs.umich.edu   third_kernel[THIRD_XXX(ptr)] = 0;			/* Stack Guard Page */
5627977Shsul@eecs.umich.edu
5637977Shsul@eecs.umich.edu   /* put argv into the bottom of the stack - argv starts at 1 because
5647977Shsul@eecs.umich.edu    * the command thatr got us here (i.e. "unixboot) is in argv[0].
5657977Shsul@eecs.umich.edu    */
5667977Shsul@eecs.umich.edu   ksp -= 8;			/* Back up one longword */
5677977Shsul@eecs.umich.edu   ksp -= argc * sizeof(char *);	/* Make room for argv */
5687977Shsul@eecs.umich.edu   kargv = (char **) ksp;
5697977Shsul@eecs.umich.edu   for (i = 1; i < argc; i++) {	/* Copy arguments to stack */
5707977Shsul@eecs.umich.edu      ksp -= ((strlen(argv[i]) + 1) + 7) & ~0x7;
5717977Shsul@eecs.umich.edu      kargv[i-1] = (char *) ksp;
5727977Shsul@eecs.umich.edu      strcpy(kargv[i-1], argv[i]);
5737977Shsul@eecs.umich.edu   }
5747977Shsul@eecs.umich.edu   kargc = i - 1;
5757977Shsul@eecs.umich.edu   kargv[kargc] = NULL;		/* just to be sure; doesn't seem to be used */
5767977Shsul@eecs.umich.edu   ksp -= sizeof(char *);	/* point above last arg for no real reason */
5777977Shsul@eecs.umich.edu
5787977Shsul@eecs.umich.edu   free_pfn = PFN(ptr);
5797977Shsul@eecs.umich.edu
5807977Shsul@eecs.umich.edu   bcopy((char *)&xxm_rpb, (char *)rpb, sizeof(struct rpb));
5817977Shsul@eecs.umich.edu
5827977Shsul@eecs.umich.edu   rpb->rpb_selfref = (struct rpb *) KSEG_TO_PHYS(rpb);
5837977Shsul@eecs.umich.edu   rpb->rpb_string = 0x0000004250525748;
5847977Shsul@eecs.umich.edu
5857977Shsul@eecs.umich.edu   tbb = (ul *) (((char *) rpb) + ROUNDUP8(sizeof(struct rpb)));
5867977Shsul@eecs.umich.edu   rpb->rpb_trans_off = (ul)tbb - (ul)rpb;
5877977Shsul@eecs.umich.edu   bcopy((char *)xxm_tbb, (char *)tbb, sizeof(xxm_tbb));
5887977Shsul@eecs.umich.edu
5897977Shsul@eecs.umich.edu
5907977Shsul@eecs.umich.edu   /*
5917977Shsul@eecs.umich.edu    * rpb_counter. Use to determine timeouts in OS.
5927977Shsul@eecs.umich.edu    * XXX must be patched after a checkpoint restore (I guess)
5937977Shsul@eecs.umich.edu    */
5947977Shsul@eecs.umich.edu
5957977Shsul@eecs.umich.edu   printf("CPU Clock at %d MHz IntrClockFrequency=%d \n", simosConf.cpuClock,simosConf.intrClockFrequency);
5967977Shsul@eecs.umich.edu   rpb->rpb_counter = simosConf.cpuClock * 1000 * 1000;
5977977Shsul@eecs.umich.edu
5987977Shsul@eecs.umich.edu   /*
5997977Shsul@eecs.umich.edu    * By definition, the rpb_clock is scaled by 4096 (in hz)
6007977Shsul@eecs.umich.edu    */
6017977Shsul@eecs.umich.edu   rpb->rpb_clock = simosConf.intrClockFrequency * 4096;
6027977Shsul@eecs.umich.edu
6037977Shsul@eecs.umich.edu
6047977Shsul@eecs.umich.edu
6057977Shsul@eecs.umich.edu   /*
6067977Shsul@eecs.umich.edu    * Per CPU Slots. Multiprocessor support.
6077977Shsul@eecs.umich.edu    */
6087977Shsul@eecs.umich.edu   {
6097977Shsul@eecs.umich.edu      int i;
6107977Shsul@eecs.umich.edu      int size = ROUNDUP128(sizeof(struct rpb_percpu));
6117977Shsul@eecs.umich.edu
6127977Shsul@eecs.umich.edu      printf("Booting with %d processor(s) \n",simosConf.numCPUs);
6137977Shsul@eecs.umich.edu
6147977Shsul@eecs.umich.edu      rpb->rpb_numprocs = simosConf.numCPUs;
6157977Shsul@eecs.umich.edu      rpb->rpb_slotsize = size;
6167977Shsul@eecs.umich.edu      rpb_percpu = (struct rpb_percpu *)
6177977Shsul@eecs.umich.edu         ROUNDUP128(((ul) tbb) +(sizeof(xxm_tbb)));
6187977Shsul@eecs.umich.edu
6197977Shsul@eecs.umich.edu      rpb->rpb_percpu_off = (ul)rpb_percpu - (ul)rpb;
6207977Shsul@eecs.umich.edu
6217977Shsul@eecs.umich.edu      for (i=0;i<simosConf.numCPUs;i++) {
6227977Shsul@eecs.umich.edu         struct rpb_percpu *thisCPU = (struct rpb_percpu*)
6237977Shsul@eecs.umich.edu            ((ul)rpb_percpu + size*i);
6247977Shsul@eecs.umich.edu
6257977Shsul@eecs.umich.edu         bzero((char *)thisCPU, size);
6267977Shsul@eecs.umich.edu         bcopy((char *)&xxm_rpb_percpu,
6277977Shsul@eecs.umich.edu               (char *)thisCPU,
6287977Shsul@eecs.umich.edu               sizeof(struct rpb_percpu));
6297977Shsul@eecs.umich.edu
6307977Shsul@eecs.umich.edu         thisCPU->rpb_pcb.rpb_ksp = ksp;
6317977Shsul@eecs.umich.edu         thisCPU->rpb_pcb.rpb_ptbr = PFN(first);
6327977Shsul@eecs.umich.edu
6337977Shsul@eecs.umich.edu         thisCPU->rpb_logout = KSEG_TO_PHYS(percpu_logout);
6347977Shsul@eecs.umich.edu         thisCPU->rpb_logout_len = 8192;
6357977Shsul@eecs.umich.edu
6367977Shsul@eecs.umich.edu/*  thisCPU->rpb_pcb.rpb_ptbr = PFN(second);*/
6377977Shsul@eecs.umich.edu
6387977Shsul@eecs.umich.edu         printf("KSP: 0x%x PTBR 0x%x\n", thisCPU->rpb_pcb.rpb_ksp, thisCPU->rpb_pcb.rpb_ptbr);
6397977Shsul@eecs.umich.edu
6407977Shsul@eecs.umich.edu         if (i) {
6417977Shsul@eecs.umich.edu            bootStrapImpure[i] = (ul)unix_boot_alloc(1);
6427977Shsul@eecs.umich.edu         }
6437977Shsul@eecs.umich.edu
6447977Shsul@eecs.umich.edu      }
6457977Shsul@eecs.umich.edu
6467977Shsul@eecs.umich.edu      nextPtr = (ul)rpb_percpu + size*simosConf.numCPUs;
6477977Shsul@eecs.umich.edu   }
6487977Shsul@eecs.umich.edu
6497977Shsul@eecs.umich.edu   /*
6507977Shsul@eecs.umich.edu    * Console Terminal Block
6517977Shsul@eecs.umich.edu    */
6527977Shsul@eecs.umich.edu
6537977Shsul@eecs.umich.edu
6547977Shsul@eecs.umich.edu      rpb_ctb = (struct rpb_ctb *) nextPtr;
6557977Shsul@eecs.umich.edu      ctb_tt = (struct ctb_tt*) rpb_ctb;
6567977Shsul@eecs.umich.edu
6577977Shsul@eecs.umich.edu      rpb->rpb_ctb_off = ((ul)rpb_ctb) - (ul)rpb;
6587977Shsul@eecs.umich.edu      rpb->rpb_ctb_size  = sizeof(struct rpb_ctb);
6597977Shsul@eecs.umich.edu
6607977Shsul@eecs.umich.edu   bzero((char *)rpb_ctb, sizeof(struct ctb_tt));
6617977Shsul@eecs.umich.edu
6627977Shsul@eecs.umich.edu#ifdef original_xxm
6637977Shsul@eecs.umich.edu   if (tga_slot == -1)
6647977Shsul@eecs.umich.edu      rpb_ctb->rpb_type = CONS_DZ;
6657977Shsul@eecs.umich.edu  else {
6667977Shsul@eecs.umich.edu    rpb_ctb->rpb_type = CONS_GRPH;
6677977Shsul@eecs.umich.edu    rpb_ctb->rpb_unit = (SLOTINFO_PCI << 16) | (0 << 8) | tga_slot;
6687977Shsul@eecs.umich.edu  }
6697977Shsul@eecs.umich.edu#else
6707977Shsul@eecs.umich.edu  rpb_ctb->rpb_type = CONS_DZ;
6717977Shsul@eecs.umich.edu#endif
6727977Shsul@eecs.umich.edu
6737977Shsul@eecs.umich.edu  rpb_ctb->rpb_length = sizeof(ctb_tt)-sizeof(rpb_ctb);
6747977Shsul@eecs.umich.edu
6757977Shsul@eecs.umich.edu  /*
6767977Shsul@eecs.umich.edu   * uart initizliation
6777977Shsul@eecs.umich.edu   */
6787977Shsul@eecs.umich.edu  ctb_tt->ctb_csr = 0;
6797977Shsul@eecs.umich.edu  ctb_tt->ctb_tivec = 0x6c0;  /* matches tlaser pal code */
6807977Shsul@eecs.umich.edu  ctb_tt->ctb_rivec = 0x680;  /* matches tlaser pal code */
6817977Shsul@eecs.umich.edu  ctb_tt->ctb_baud = 9600;
6827977Shsul@eecs.umich.edu  ctb_tt->ctb_put_sts = 0;
6837977Shsul@eecs.umich.edu  ctb_tt->ctb_get_sts = 0;
6847977Shsul@eecs.umich.edu
6857977Shsul@eecs.umich.edu
6867977Shsul@eecs.umich.edu  rpb_crb = (struct rpb_crb *) (((ul)rpb_ctb) + sizeof(struct ctb_tt));
6877977Shsul@eecs.umich.edu  rpb->rpb_crb_off = ((ul)rpb_crb) - (ul)rpb;
6887977Shsul@eecs.umich.edu
6897977Shsul@eecs.umich.edu  bzero((char *)rpb_crb, sizeof(struct rpb_crb));
6907977Shsul@eecs.umich.edu  /*
6917977Shsul@eecs.umich.edu   * console callback stuff (simos)
6927977Shsul@eecs.umich.edu   */
6937977Shsul@eecs.umich.edu
6947977Shsul@eecs.umich.edu  rpb_crb->rpb_num = 1;
6957977Shsul@eecs.umich.edu  rpb_crb->rpb_mapped_pages = HWRPB_PAGES;
6967977Shsul@eecs.umich.edu  rpb_crb->rpb_map[0].rpb_virt = 0x10000000;
6977977Shsul@eecs.umich.edu  rpb_crb->rpb_map[0].rpb_phys = ((ul)rpb) & ~0x1fff;
6987977Shsul@eecs.umich.edu  rpb_crb->rpb_map[0].rpb_pgcount = HWRPB_PAGES;
6997977Shsul@eecs.umich.edu
7007977Shsul@eecs.umich.edu
7017977Shsul@eecs.umich.edu  printf("Console Callback at 0x%x, fixup at 0x%x \n",
7027977Shsul@eecs.umich.edu          rpb_crb->rpb_va_disp,
7037977Shsul@eecs.umich.edu          rpb_crb->rpb_va_fixup );
7047977Shsul@eecs.umich.edu
7057977Shsul@eecs.umich.edu  rpb_mdt = (struct _xxm_rpb_mdt *) (((ul)rpb_crb) + sizeof(struct rpb_crb));
7067977Shsul@eecs.umich.edu  rpb->rpb_mdt_off = (ul)rpb_mdt - (ul)rpb;
7077977Shsul@eecs.umich.edu  bcopy((char *)&xxm_rpb_mdt, (char *)rpb_mdt, sizeof(struct _xxm_rpb_mdt));
7087977Shsul@eecs.umich.edu
7097977Shsul@eecs.umich.edu
7107977Shsul@eecs.umich.edu  cl = 0;
7117977Shsul@eecs.umich.edu#ifdef undef
7127977Shsul@eecs.umich.edu  /* Until Digital Unix can handle it, account all pages below the kernel
7137977Shsul@eecs.umich.edu   * as "console" memory. */
7147977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfncount = cons_pages;
7157977Shsul@eecs.umich.edu#endif
7167977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfncount = kern_first_page;
7177977Shsul@eecs.umich.edu  cl++;
7187977Shsul@eecs.umich.edu
7197977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfn = kern_first_page;
7207977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfncount = mem_pages - kern_first_page;
7217977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfntested=rpb_mdt->rpb_cluster[cl].rpb_pfncount;
7227977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pa = KSEG_TO_PHYS(mdt_bitmap);
7237977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_va = 0x10000000 + HWRPB_PAGES * 8192;
7247977Shsul@eecs.umich.edu  cl++;
7257977Shsul@eecs.umich.edu
7267977Shsul@eecs.umich.edu#ifdef undef
7277977Shsul@eecs.umich.edu  /* The stupid Unix kernel needs to have all mdt clusters in ascending
7287977Shsul@eecs.umich.edu   * order, and the last cluster is used to compute the top of memory.
7297977Shsul@eecs.umich.edu   * It can't make use of memory between the console and the kernel.
7307977Shsul@eecs.umich.edu   */
7317977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfn = cons_pages;
7327977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfncount = kern_first_page - cons_pages;
7337977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pfntested=rpb_mdt->rpb_cluster[cl].rpb_pfncount;
7347977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_pa = KSEG_TO_PHYS(mdt_bitmap);
7357977Shsul@eecs.umich.edu  rpb_mdt->rpb_cluster[cl].rpb_va = 0x10000000 + HWRPB_PAGES * 8192;
7367977Shsul@eecs.umich.edu  cl++;
7377977Shsul@eecs.umich.edu#endif
7387977Shsul@eecs.umich.edu
7397977Shsul@eecs.umich.edu  rpb_mdt->rpb_numcl = cl;
7407977Shsul@eecs.umich.edu
7417977Shsul@eecs.umich.edu  for (i = 0; i < cl; i++)
7427977Shsul@eecs.umich.edu    printf("Memory cluster %d [%d - %d]\n", i, rpb_mdt->rpb_cluster[i].rpb_pfn, rpb_mdt->rpb_cluster[i].rpb_pfncount);
7437977Shsul@eecs.umich.edu
7447977Shsul@eecs.umich.edu
7457977Shsul@eecs.umich.edu
7467977Shsul@eecs.umich.edu  /* Checksum the rpb for good luck */
7477977Shsul@eecs.umich.edu  sum = 0;
7487977Shsul@eecs.umich.edu  lp1 = (long *)&rpb_mdt->rpb_impaddr;
7497977Shsul@eecs.umich.edu  lp2 = (long *)&rpb_mdt->rpb_cluster[cl];
7507977Shsul@eecs.umich.edu  while (lp1 < lp2) sum += *lp1++;
7517977Shsul@eecs.umich.edu  rpb_mdt->rpb_checksum = sum;
7527977Shsul@eecs.umich.edu
7537977Shsul@eecs.umich.edu  /* XXX should checksum the cluster descriptors */
7547977Shsul@eecs.umich.edu
7557977Shsul@eecs.umich.edu  bzero((char *)mdt_bitmap, MDT_BITMAP_PAGES * 8192);
7567977Shsul@eecs.umich.edu  for (i = 0; i < mem_pages/8; i++) ((unsigned char *)mdt_bitmap)[i] = 0xff;
7577977Shsul@eecs.umich.edu
7587977Shsul@eecs.umich.edu  printf("Initalizing mdt_bitmap addr 0x%x mem_pages %x \n",
7597977Shsul@eecs.umich.edu         (long)mdt_bitmap,(long)mem_pages);
7607977Shsul@eecs.umich.edu
7617977Shsul@eecs.umich.edu  xxm_rpb.rpb_config_off = 0;
7627977Shsul@eecs.umich.edu  xxm_rpb.rpb_fru_off = 0;
7637977Shsul@eecs.umich.edu
7647977Shsul@eecs.umich.edu  rpb_dsr = (struct rpb_dsr *) (((ul)rpb_mdt) + sizeof(struct _xxm_rpb_mdt));
7657977Shsul@eecs.umich.edu  rpb->rpb_dsr_off = ((ul)rpb_dsr) - (ul)rpb;
7667977Shsul@eecs.umich.edu  bzero((char *)rpb_dsr, sizeof(struct rpb_dsr));
7677977Shsul@eecs.umich.edu  rpb_dsr->rpb_smm = 1578; /* Official XXM SMM number as per SRM */
7687977Shsul@eecs.umich.edu  rpb_dsr->rpb_smm = 1089; /* Official Alcor SMM number as per SRM */
7697977Shsul@eecs.umich.edu
7707977Shsul@eecs.umich.edu  rpb_lurt = (int *) ROUNDUP8(((ul)rpb_dsr) + sizeof(struct rpb_dsr));
7717977Shsul@eecs.umich.edu  rpb_dsr->rpb_lurt_off = ((ul) rpb_lurt) - (ul) rpb_dsr;
7727977Shsul@eecs.umich.edu  bcopy((char *)xxm_lurt, (char *)rpb_lurt, sizeof(xxm_lurt));
7737977Shsul@eecs.umich.edu
7747977Shsul@eecs.umich.edu  rpb_name = (char *) ROUNDUP8(((ul)rpb_lurt) + sizeof(xxm_lurt));
7757977Shsul@eecs.umich.edu  rpb_dsr->rpb_sysname_off = ((ul) rpb_name) - (ul) rpb_dsr;
7767977Shsul@eecs.umich.edu#define THENAME "             SimOS ALPHA/EV5"
7777977Shsul@eecs.umich.edu  sum = sizeof(THENAME);
7787977Shsul@eecs.umich.edu  bcopy(THENAME, rpb_name, sum);
7797977Shsul@eecs.umich.edu  *(ul *)rpb_name = sizeof(THENAME); /* put in length field */
7807977Shsul@eecs.umich.edu
7817977Shsul@eecs.umich.edu  /* calculate size of rpb */
7827977Shsul@eecs.umich.edu  rpb->rpb_size = ((ul) &rpb_name[sum]) - (ul)rpb;
7837977Shsul@eecs.umich.edu
7847977Shsul@eecs.umich.edu  if (rpb->rpb_size > 8192*HWRPB_PAGES) {
7857977Shsul@eecs.umich.edu     panic("HWRPB_PAGES=%d too small for HWRPB !!! \n");
7867977Shsul@eecs.umich.edu  }
7877977Shsul@eecs.umich.edu
7887977Shsul@eecs.umich.edu
7897977Shsul@eecs.umich.edu {
7907977Shsul@eecs.umich.edu     ul *ptr = (ul*)((char*)rpb_dsr + sizeof(struct rpb_dsr ));
7917977Shsul@eecs.umich.edu     rpb_crb->rpb_pa_disp = KSEG_TO_PHYS(ptr);
7927978Sbinkertn@umich.edu#if 0
7937977Shsul@eecs.umich.edu     rpb_crb->rpb_va_disp = 0x10000000 + ((ul)ptr&(0x2000*HWRPB_PAGES-1));
7947978Sbinkertn@umich.edu#else
7957978Sbinkertn@umich.edu     rpb_crb->rpb_va_disp = 0x10000000 + ((ul)ptr & 0x1fff);
7967978Sbinkertn@umich.edu#endif
7977977Shsul@eecs.umich.edu     printf("ConsoleDispatch at virt %x phys %x val %x\n",
7987977Shsul@eecs.umich.edu             rpb_crb->rpb_va_disp,
7997977Shsul@eecs.umich.edu            rpb_crb->rpb_pa_disp,
8007977Shsul@eecs.umich.edu            consoleCallback);
8017977Shsul@eecs.umich.edu     *ptr++ = 0;
8027977Shsul@eecs.umich.edu     *ptr++ = (ul) consoleCallback;
8037977Shsul@eecs.umich.edu     rpb_crb->rpb_pa_fixup = KSEG_TO_PHYS(ptr);
8047978Sbinkertn@umich.edu#if 0
8057977Shsul@eecs.umich.edu     rpb_crb->rpb_va_fixup = 0x10000000 + ((ul)ptr& (0x2000*HWRPB_PAGES-1));
8067978Sbinkertn@umich.edu#else
8077978Sbinkertn@umich.edu     rpb_crb->rpb_va_fixup = 0x10000000 + ((ul)ptr & 0x1fff);
8087978Sbinkertn@umich.edu#endif
8097977Shsul@eecs.umich.edu     *ptr++ = 0;
8107977Shsul@eecs.umich.edu     *ptr++ = (ul) consoleFixup;
8117977Shsul@eecs.umich.edu  }
8127977Shsul@eecs.umich.edu
8137977Shsul@eecs.umich.edu
8147977Shsul@eecs.umich.edu  /* Checksum the rpb for good luck */
8157977Shsul@eecs.umich.edu  sum = 0;
8167977Shsul@eecs.umich.edu  lp1 = (long *)rpb;
8177977Shsul@eecs.umich.edu  lp2 = &rpb->rpb_checksum;
8187977Shsul@eecs.umich.edu  while (lp1 < lp2)
8197977Shsul@eecs.umich.edu    sum += *lp1++;
8207977Shsul@eecs.umich.edu  *lp2 = sum;
8217977Shsul@eecs.umich.edu
8227977Shsul@eecs.umich.edu
8237977Shsul@eecs.umich.edu  /*
8247977Shsul@eecs.umich.edu   * MP bootstrap
8257977Shsul@eecs.umich.edu   */
8267977Shsul@eecs.umich.edu
8277977Shsul@eecs.umich.edu  {
8287977Shsul@eecs.umich.edu     int i;
8297977Shsul@eecs.umich.edu     for (i=1;i<simosConf.numCPUs;i++) {
8307978Sbinkertn@umich.edu        volatile struct AlphaAccess *k1Conf = (volatile struct AlphaAccess *)
8317977Shsul@eecs.umich.edu           (__MAGIC_ZONE(0, 0, MAGIC_ZONE_EV5_ALIAS));
8327977Shsul@eecs.umich.edu        SpinLock(&theLock);
8337977Shsul@eecs.umich.edu        printf("Bootstraping CPU %d with sp=0x%x \n",
8347977Shsul@eecs.umich.edu               i,bootStrapImpure[i]);
8357977Shsul@eecs.umich.edu        SpinUnlock(&theLock);
8367977Shsul@eecs.umich.edu        k1Conf->bootStrapImpure = bootStrapImpure[i];
8377977Shsul@eecs.umich.edu        k1Conf->bootStrapCPU = i;
8387977Shsul@eecs.umich.edu     }
8397977Shsul@eecs.umich.edu  }
8407977Shsul@eecs.umich.edu
8417977Shsul@eecs.umich.edu  /*
8427977Shsul@eecs.umich.edu   * Make sure that we are not stepping on the kernel
8437977Shsul@eecs.umich.edu   */
8447977Shsul@eecs.umich.edu  if ((ul)unix_boot_mem >= (ul)simosConf.kernStart) {
8457977Shsul@eecs.umich.edu     panic("CONSOLE: too much memory. Smashing kernel  \n");
8467977Shsul@eecs.umich.edu  } else {
8477977Shsul@eecs.umich.edu     SpinLock(&theLock);
8487977Shsul@eecs.umich.edu     printf("unix_boot_mem ends at %x \n",unix_boot_mem);
8497977Shsul@eecs.umich.edu     SpinUnlock(&theLock);
8507977Shsul@eecs.umich.edu  }
8517977Shsul@eecs.umich.edu
8527977Shsul@eecs.umich.edu
8537977Shsul@eecs.umich.edu#ifdef undef
8547977Shsul@eecs.umich.edu#define CSERVE_K_JTOKERN	0x18
8557977Shsul@eecs.umich.edu  cServe(bootadr, (ul) rpb_percpu, CSERVE_K_JTOKERN, free_pfn);
8567977Shsul@eecs.umich.edu#endif
8577977Shsul@eecs.umich.edu
8587977Shsul@eecs.umich.edu  if (go) JToKern(bootadr, rpb_percpu, free_pfn, kargc, kargv, NULL);
8597977Shsul@eecs.umich.edu}
8607977Shsul@eecs.umich.edu
8617977Shsul@eecs.umich.edu
8627977Shsul@eecs.umich.edu#if 0
8637977Shsul@eecs.umich.eduaoutfixup(char *p)
8647977Shsul@eecs.umich.edu{
8657977Shsul@eecs.umich.edu  int i;
8667977Shsul@eecs.umich.edu  unsigned long rem, len, off, dst;
8677977Shsul@eecs.umich.edu
8687977Shsul@eecs.umich.edu
8697977Shsul@eecs.umich.edu  struct new_aouthdr *ao = (struct new_aouthdr *) &p[NEW_FILHSZ];
8707977Shsul@eecs.umich.edu#if 0
8717977Shsul@eecs.umich.edu  struct scnhdr *s = (struct scnhdr *) &p[FILHSZ + AOUTHSZ];
8727977Shsul@eecs.umich.edu  struct scnhdr *t, *d, *b;
8737977Shsul@eecs.umich.edu  printf("aoutfixup: %d sections \n",fh->f_nscns);
8747977Shsul@eecs.umich.edu#endif
8757977Shsul@eecs.umich.edu
8767977Shsul@eecs.umich.edu
8777977Shsul@eecs.umich.edu  aout_text_start = ((ul)ao->text_start_hi<<32) + ao->text_start;
8787977Shsul@eecs.umich.edu  aout_data_addr = ((ul)ao->data_start_hi<<32) + ao->data_start;
8797977Shsul@eecs.umich.edu  aout_bss_addr = ((ul)ao->bss_start_hi<<32) + ao->bss_start;
8807977Shsul@eecs.umich.edu  aout_bss_size = ((ul)ao->bsize_hi<<32) +  ao->bsize;
8817977Shsul@eecs.umich.edu  aout_entry = ((ul)ao->entry_hi<<32) + ao->entry;
8827977Shsul@eecs.umich.edu
8837977Shsul@eecs.umich.edu  printf("_text 0x%16x %8d @ %08d\n", aout_text_start, ao->tsize,0 /* t->s_scnptr*/);
8847977Shsul@eecs.umich.edu  printf("_data 0x%16x %8d @ %08d\n", aout_data_addr, ao->dsize,0/* d->s_scnptr*/);
8857977Shsul@eecs.umich.edu  printf("_bss  0x%16x %8d\n", aout_bss_addr,  ao->bsize);
8867977Shsul@eecs.umich.edu  printf("entry 0x%16x\n", aout_entry);
8877977Shsul@eecs.umich.edu#if 0
8887977Shsul@eecs.umich.edu  for (i = 0; i < fh->f_nscns; i++) {
8897977Shsul@eecs.umich.edu     printf("section %d %s \n",i,s[i].s_name);
8907977Shsul@eecs.umich.edu    if (!strcmp(s[i].s_name, ".text")) t = &s[i];
8917977Shsul@eecs.umich.edu    else if (!strcmp(s[i].s_name, ".data")) d = &s[i];
8927977Shsul@eecs.umich.edu    else if (!strcmp(s[i].s_name, ".bss")) b = &s[i];
8937977Shsul@eecs.umich.edu  }
8947977Shsul@eecs.umich.edu  bcopy(&p[t->s_scnptr], (char *)ao->text_start, ao->tsize);
8957977Shsul@eecs.umich.edu  bcopy(&p[d->s_scnptr], (char *)ao->data_start, ao->dsize);
8967977Shsul@eecs.umich.edu#endif
8977977Shsul@eecs.umich.edu}
8987977Shsul@eecs.umich.edu#endif
8997977Shsul@eecs.umich.edu
9007977Shsul@eecs.umich.eduextern ui palJToKern[];
9017977Shsul@eecs.umich.edu
9027977Shsul@eecs.umich.eduJToKern(bootadr, rpb_percpu, free_pfn, k_argc, k_argv, envp)
9037977Shsul@eecs.umich.educhar * bootadr;
9047977Shsul@eecs.umich.eduul rpb_percpu;
9057977Shsul@eecs.umich.eduul free_pfn;
9067977Shsul@eecs.umich.eduul k_argc;
9077977Shsul@eecs.umich.educhar **k_argv;
9087977Shsul@eecs.umich.educhar **envp;
9097977Shsul@eecs.umich.edu{
9107977Shsul@eecs.umich.edu  struct _kernel_params *kernel_params = (struct _kernel_params *) KSEG;
9117977Shsul@eecs.umich.edu  int i;
9127977Shsul@eecs.umich.edu
9137977Shsul@eecs.umich.edu  printf("k_argc = %d ", k_argc);
9147977Shsul@eecs.umich.edu  for (i = 0; i < k_argc; i++) {
9157977Shsul@eecs.umich.edu    printf("'%s' ", k_argv[i]);
9167977Shsul@eecs.umich.edu  }
9177977Shsul@eecs.umich.edu  printf("\n");
9187977Shsul@eecs.umich.edu
9197977Shsul@eecs.umich.edu/*  rpb_percpu |= 0xfffffc0000000000;*/
9207977Shsul@eecs.umich.edu  kernel_params->bootadr = bootadr;
9217977Shsul@eecs.umich.edu  kernel_params->rpb_percpu = KSEG_TO_PHYS(rpb_percpu);
9227977Shsul@eecs.umich.edu  kernel_params->free_pfn = free_pfn;
9237977Shsul@eecs.umich.edu  kernel_params->argc = k_argc;
9247977Shsul@eecs.umich.edu  kernel_params->argv = (ul)k_argv;
9257977Shsul@eecs.umich.edu  kernel_params->envp = (ul)envp;
9267977Shsul@eecs.umich.edu  printf("jumping to kernel at 0x%x, (PCBB 0x%x pfn %d)\n", bootadr, rpb_percpu, free_pfn);
9277977Shsul@eecs.umich.edu  jToPal(KSEG_TO_PHYS((ul)palJToKern));
9287977Shsul@eecs.umich.edu  printf("returned from jToPal. Looping\n");
9297977Shsul@eecs.umich.edu  while(1) continue;
9307977Shsul@eecs.umich.edu}
9317977Shsul@eecs.umich.edu
9327977Shsul@eecs.umich.edu
9337977Shsul@eecs.umich.eduvoid jToPal(ul bootadr)
9347977Shsul@eecs.umich.edu{
9357977Shsul@eecs.umich.edu  cServe(bootadr, 0, CSERVE_K_JTOPAL);
9367977Shsul@eecs.umich.edu
9377977Shsul@eecs.umich.edu/*
9387977Shsul@eecs.umich.edu * Make sure that floating point is enabled incase
9397977Shsul@eecs.umich.edu * it was disabled by the user program.
9407977Shsul@eecs.umich.edu */
9417977Shsul@eecs.umich.edu  wrfen(1);
9427977Shsul@eecs.umich.edu}
9437977Shsul@eecs.umich.edu
9447977Shsul@eecs.umich.edu
9457977Shsul@eecs.umich.eduint strcpy(char *dst, char *src)
9467977Shsul@eecs.umich.edu{
9477977Shsul@eecs.umich.edu   int i=0;
9487977Shsul@eecs.umich.edu   while(*src) {
9497977Shsul@eecs.umich.edu      *dst++ = *src++;
9507977Shsul@eecs.umich.edu      i++;
9517977Shsul@eecs.umich.edu   }
9527977Shsul@eecs.umich.edu   return i;
9537977Shsul@eecs.umich.edu}
9547977Shsul@eecs.umich.edu
9557977Shsul@eecs.umich.edu
9567977Shsul@eecs.umich.edu
9577977Shsul@eecs.umich.edu
9587977Shsul@eecs.umich.edu/* *****************************************
9597977Shsul@eecs.umich.edu * Console I/O
9607977Shsul@eecs.umich.edu * ******************************************/
9617977Shsul@eecs.umich.edu
9627977Shsul@eecs.umich.eduint numOpenDevices = 11;
9637977Shsul@eecs.umich.edustruct {
9647977Shsul@eecs.umich.edu   char name[128];
9657977Shsul@eecs.umich.edu} deviceState[32];
9667977Shsul@eecs.umich.edu
9677978Sbinkertn@umich.edu#define BOOTDEVICE_NAME "SCSI 1 0 0 1 100 0"
9687977Shsul@eecs.umich.edu
9697978Sbinkertn@umich.eduvoid
9707978Sbinkertn@umich.eduDeviceOperation(long op, long channel, long count, long address, long block)
9717977Shsul@eecs.umich.edu{
9727978Sbinkertn@umich.edu   struct AlphaAccess *k1Conf = (struct AlphaAccess *)
9737977Shsul@eecs.umich.edu      (__MAGIC_ZONE(0, 0, MAGIC_ZONE_EV5_ALIAS));
9747977Shsul@eecs.umich.edu
9757977Shsul@eecs.umich.edu   long pAddr;
9767977Shsul@eecs.umich.edu
9777977Shsul@eecs.umich.edu#if 0
9787977Shsul@eecs.umich.edu   printf("Console::DeviceRead count=0x%x address=0x%x block=0x%x\n",
9797977Shsul@eecs.umich.edu          count,address,block);
9807977Shsul@eecs.umich.edu#endif
9817977Shsul@eecs.umich.edu
9827977Shsul@eecs.umich.edu   if (strcmp(deviceState[channel].name, BOOTDEVICE_NAME )) {
9837977Shsul@eecs.umich.edu      panic("DeviceRead: only implemented for root disk \n");
9847977Shsul@eecs.umich.edu   }
9857977Shsul@eecs.umich.edu   pAddr = KSEG_TO_PHYS(address);
9867977Shsul@eecs.umich.edu   if (pAddr + count > simosConf.mem_size) {
9877977Shsul@eecs.umich.edu      panic("DeviceRead: request out of range \n");
9887977Shsul@eecs.umich.edu   }
9897977Shsul@eecs.umich.edu
9907977Shsul@eecs.umich.edu   k1Conf->diskCount = count;
9917977Shsul@eecs.umich.edu   k1Conf->diskPAddr = pAddr;
9927977Shsul@eecs.umich.edu   k1Conf->diskBlock = block;
9937977Shsul@eecs.umich.edu   k1Conf->diskOperation = op; /* launch */
9947977Shsul@eecs.umich.edu}
9957977Shsul@eecs.umich.edu
9967977Shsul@eecs.umich.edu
9977977Shsul@eecs.umich.edu
9987977Shsul@eecs.umich.edu/* *************************************************************************
9997977Shsul@eecs.umich.edu * SimoS Console callbacks
10007977Shsul@eecs.umich.edu * **************************************************/
10017977Shsul@eecs.umich.edu
10027977Shsul@eecs.umich.edu/* AXP manual 2-31 */
10037977Shsul@eecs.umich.edu#define CONSCB_GETC 0x1
10047977Shsul@eecs.umich.edu#define CONSCB_PUTS 0x2
10057977Shsul@eecs.umich.edu#define CONSCB_RESET_TERM 0x3
10067977Shsul@eecs.umich.edu#define CONSCB_SET_TERM_INT 0x4
10077977Shsul@eecs.umich.edu#define CONSCB_SET_TERM_CTL 0x5
10087977Shsul@eecs.umich.edu#define CONSCB_PROCESS_KEY 0x6
10097982Ssaidi@eecs.umich.edu#define CONSCB_OPEN_CONSOLE 0x7
10107982Ssaidi@eecs.umich.edu#define CONSCB_CLOSE_CONSOLE 0x8
10117977Shsul@eecs.umich.edu
10127977Shsul@eecs.umich.edu#define CONSCB_OPEN 0x10
10137977Shsul@eecs.umich.edu#define CONSCB_CLOSE 0x11
10147977Shsul@eecs.umich.edu#define CONSCB_READ 0x13
10157977Shsul@eecs.umich.edu
10167977Shsul@eecs.umich.edu#define CONSCB_GETENV 0x22
10177977Shsul@eecs.umich.edu
10187977Shsul@eecs.umich.edu/* AXP manual 2-26 */
10197978Sbinkertn@umich.edu#define	ENV_AUTO_ACTION		0X01
10207978Sbinkertn@umich.edu#define	ENV_BOOT_DEV		0X02
10217978Sbinkertn@umich.edu#define	ENV_BOOTDEF_DEV		0X03
10227978Sbinkertn@umich.edu#define	ENV_BOOTED_DEV		0X04
10237978Sbinkertn@umich.edu#define	ENV_BOOT_FILE		0X05
10247978Sbinkertn@umich.edu#define	ENV_BOOTED_FILE		0X06
10257978Sbinkertn@umich.edu#define	ENV_BOOT_OSFLAGS	0X07
10267978Sbinkertn@umich.edu#define	ENV_BOOTED_OSFLAGS	0X08
10277978Sbinkertn@umich.edu#define	ENV_BOOT_RESET		0X09
10287978Sbinkertn@umich.edu#define	ENV_DUMP_DEV		0X0A
10297978Sbinkertn@umich.edu#define	ENV_ENABLE_AUDIT	0X0B
10307978Sbinkertn@umich.edu#define	ENV_LICENSE		0X0C
10317978Sbinkertn@umich.edu#define	ENV_CHAR_SET		0X0D
10327978Sbinkertn@umich.edu#define	ENV_LANGUAGE		0X0E
10337978Sbinkertn@umich.edu#define	ENV_TTY_DEV		0X0F
10347978Sbinkertn@umich.edu#define	ENV_SCSIID		0X42
10357978Sbinkertn@umich.edu#define	ENV_SCSIFAST		0X43
10367978Sbinkertn@umich.edu#define	ENV_COM1_BAUD		0X44
10377978Sbinkertn@umich.edu#define	ENV_COM1_MODEM		0X45
10387978Sbinkertn@umich.edu#define	ENV_COM1_FLOW		0X46
10397978Sbinkertn@umich.edu#define	ENV_COM1_MISC		0X47
10407978Sbinkertn@umich.edu#define	ENV_COM2_BAUD		0X48
10417978Sbinkertn@umich.edu#define	ENV_COM2_MODEM		0X49
10427978Sbinkertn@umich.edu#define	ENV_COM2_FLOW		0X4A
10437978Sbinkertn@umich.edu#define	ENV_COM2_MISC		0X4B
10447978Sbinkertn@umich.edu#define	ENV_PASSWORD		0X4C
10457978Sbinkertn@umich.edu#define	ENV_SECURE		0X4D
10467978Sbinkertn@umich.edu#define	ENV_LOGFAIL		0X4E
10477978Sbinkertn@umich.edu#define	ENV_SRM2DEV_ID		0X4F
10487977Shsul@eecs.umich.edu
10497978Sbinkertn@umich.edu#define MAX_ENVLEN 32
10507977Shsul@eecs.umich.edu
10517979Sbinkertn@umich.educhar	env_auto_action[MAX_ENVLEN]	= "BOOT";
10527978Sbinkertn@umich.educhar	env_boot_dev[MAX_ENVLEN]	= "";
10537978Sbinkertn@umich.educhar	env_bootdef_dev[MAX_ENVLEN]	= "";
10547979Sbinkertn@umich.educhar	env_booted_dev[MAX_ENVLEN]	= BOOTDEVICE_NAME;
10557978Sbinkertn@umich.educhar	env_boot_file[MAX_ENVLEN]	= "";
10567978Sbinkertn@umich.educhar	env_booted_file[MAX_ENVLEN]	= "";
10577978Sbinkertn@umich.educhar	env_boot_osflags[MAX_ENVLEN]	= "";
10587979Sbinkertn@umich.educhar	env_booted_osflags[MAX_ENVLEN]	= "";
10597978Sbinkertn@umich.educhar	env_boot_reset[MAX_ENVLEN]	= "";
10607978Sbinkertn@umich.educhar	env_dump_dev[MAX_ENVLEN]	= "";
10617978Sbinkertn@umich.educhar	env_enable_audit[MAX_ENVLEN]	= "";
10627978Sbinkertn@umich.educhar	env_license[MAX_ENVLEN]		= "";
10637978Sbinkertn@umich.educhar	env_char_set[MAX_ENVLEN]	= "";
10647979Sbinkertn@umich.educhar	env_language[MAX_ENVLEN]	= "";
10657979Sbinkertn@umich.educhar	env_tty_dev[MAX_ENVLEN]		= "0";
10667978Sbinkertn@umich.educhar	env_scsiid[MAX_ENVLEN]		= "";
10677978Sbinkertn@umich.educhar	env_scsifast[MAX_ENVLEN]	= "";
10687979Sbinkertn@umich.educhar	env_com1_baud[MAX_ENVLEN]	= "";
10697978Sbinkertn@umich.educhar	env_com1_modem[MAX_ENVLEN]	= "";
10707978Sbinkertn@umich.educhar	env_com1_flow[MAX_ENVLEN]	= "";
10717978Sbinkertn@umich.educhar	env_com1_misc[MAX_ENVLEN]	= "";
10727978Sbinkertn@umich.educhar	env_com2_baud[MAX_ENVLEN]	= "";
10737978Sbinkertn@umich.educhar	env_com2_modem[MAX_ENVLEN]	= "";
10747978Sbinkertn@umich.educhar	env_com2_flow[MAX_ENVLEN]	= "";
10757978Sbinkertn@umich.educhar	env_com2_misc[MAX_ENVLEN]	= "";
10767978Sbinkertn@umich.educhar	env_password[MAX_ENVLEN]	= "";
10777979Sbinkertn@umich.educhar	env_secure[MAX_ENVLEN]		= "";
10787978Sbinkertn@umich.educhar	env_logfail[MAX_ENVLEN]		= "";
10797978Sbinkertn@umich.educhar	env_srm2dev_id[MAX_ENVLEN]	= "";
10807979Sbinkertn@umich.edu
10817979Sbinkertn@umich.edu#define MAX_ENV_INDEX 100
10827979Sbinkertn@umich.educhar *env_ptr[MAX_ENV_INDEX] =
10837979Sbinkertn@umich.edu{
10847979Sbinkertn@umich.edu    0,					/* 0x00 */
10857979Sbinkertn@umich.edu    env_auto_action,			/* 0x01 */
10867979Sbinkertn@umich.edu    env_boot_dev,			/* 0x02 */
10877979Sbinkertn@umich.edu    env_bootdef_dev,			/* 0x03 */
10887979Sbinkertn@umich.edu    env_booted_dev,			/* 0x04 */
10897979Sbinkertn@umich.edu    env_boot_file,			/* 0x05 */
10907979Sbinkertn@umich.edu    env_booted_file,			/* 0x06 */
10917979Sbinkertn@umich.edu    env_boot_osflags,			/* 0x07 */
10927979Sbinkertn@umich.edu    env_booted_osflags,			/* 0x08 */
10937979Sbinkertn@umich.edu    env_boot_reset,			/* 0x09 */
10947979Sbinkertn@umich.edu    env_dump_dev,			/* 0x0A */
10957979Sbinkertn@umich.edu    env_enable_audit,			/* 0x0B */
10967979Sbinkertn@umich.edu    env_license,			/* 0x0C */
10977979Sbinkertn@umich.edu    env_char_set,			/* 0x0D */
10987979Sbinkertn@umich.edu    (char *)&env_language,		/* 0x0E */
10997979Sbinkertn@umich.edu    env_tty_dev,			/* 0x0F */
11007979Sbinkertn@umich.edu    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,	/* 0x10 - 0x1F */
11017979Sbinkertn@umich.edu    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,	/* 0x20 - 0x2F */
11027979Sbinkertn@umich.edu    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,	/* 0x30 - 0x3F */
11037979Sbinkertn@umich.edu    0,					/* 0x40 */
11047979Sbinkertn@umich.edu    0,					/* 0x41 */
11057979Sbinkertn@umich.edu    env_scsiid,				/* 0x42 */
11067979Sbinkertn@umich.edu    env_scsifast,			/* 0x43 */
11077979Sbinkertn@umich.edu    env_com1_baud,			/* 0x44 */
11087979Sbinkertn@umich.edu    env_com1_modem,			/* 0x45 */
11097979Sbinkertn@umich.edu    env_com1_flow,			/* 0x46 */
11107979Sbinkertn@umich.edu    env_com1_misc,			/* 0x47 */
11117979Sbinkertn@umich.edu    env_com2_baud,			/* 0x48 */
11127979Sbinkertn@umich.edu    env_com2_modem,			/* 0x49 */
11137979Sbinkertn@umich.edu    env_com2_flow,			/* 0x4A */
11147979Sbinkertn@umich.edu    env_com2_misc,			/* 0x4B */
11157979Sbinkertn@umich.edu    env_password,			/* 0x4C */
11167979Sbinkertn@umich.edu    env_secure,				/* 0x4D */
11177979Sbinkertn@umich.edu    env_logfail,			/* 0x4E */
11187979Sbinkertn@umich.edu    env_srm2dev_id,			/* 0x4F */
11197979Sbinkertn@umich.edu    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,	/* 0x50 - 0x5F */
11207979Sbinkertn@umich.edu    0,					/* 0x60 */
11217979Sbinkertn@umich.edu    0,					/* 0x61 */
11227979Sbinkertn@umich.edu    0,					/* 0x62 */
11237979Sbinkertn@umich.edu    0,					/* 0x63 */
11247979Sbinkertn@umich.edu};
11257978Sbinkertn@umich.edu
11267978Sbinkertn@umich.edulong
11277978Sbinkertn@umich.eduCallBackDispatcher(long a0, long a1, long a2, long a3, long a4)
11287977Shsul@eecs.umich.edu{
11297978Sbinkertn@umich.edu   long i;
11307977Shsul@eecs.umich.edu   switch (a0) {
11317978Sbinkertn@umich.edu   case CONSCB_GETC:
11327981Sbinkertn@umich.edu     return GetChar();
11337978Sbinkertn@umich.edu
11347977Shsul@eecs.umich.edu   case CONSCB_PUTS:
11357981Sbinkertn@umich.edu      for(i = 0; i < a3; i++)
11367982Ssaidi@eecs.umich.edu         PutChar(*((char *)a2+i));
11377977Shsul@eecs.umich.edu      return a3;
11387978Sbinkertn@umich.edu
11397977Shsul@eecs.umich.edu   case CONSCB_GETENV:
11407979Sbinkertn@umich.edu     if (a1 >= 0 && a1 < MAX_ENV_INDEX && env_ptr[a1] != 0 && *env_ptr[a1]) {
11417979Sbinkertn@umich.edu         i = strcpy((char*)a2, env_ptr[a1]);
11427979Sbinkertn@umich.edu     } else {
11437979Sbinkertn@umich.edu         strcpy((char*)a2, "");
11447979Sbinkertn@umich.edu         i = (long)0xc000000000000000;
11457979Sbinkertn@umich.edu         if (a1 >= 0 && a1 < MAX_ENV_INDEX)
11467979Sbinkertn@umich.edu             printf ("GETENV unsupported option %d (0x%x)\n", a1, a1);
11477979Sbinkertn@umich.edu         else
11487979Sbinkertn@umich.edu             printf ("GETENV unsupported option %s\n", a1);
11497979Sbinkertn@umich.edu     }
11507978Sbinkertn@umich.edu
11517979Sbinkertn@umich.edu     if (i > a3)
11527979Sbinkertn@umich.edu         panic("CONSCB_GETENV overwrote buffer\n");
11537979Sbinkertn@umich.edu     return i;
11547978Sbinkertn@umich.edu
11557977Shsul@eecs.umich.edu   case CONSCB_OPEN:
11567977Shsul@eecs.umich.edu      bcopy((char*)a1,deviceState[numOpenDevices].name,a2);
11577977Shsul@eecs.umich.edu      deviceState[numOpenDevices].name[a2] = '\0';
11587977Shsul@eecs.umich.edu      printf("CONSOLE OPEN : %s --> success \n",
11597977Shsul@eecs.umich.edu             deviceState[numOpenDevices].name);
11607977Shsul@eecs.umich.edu      return numOpenDevices++;
11617977Shsul@eecs.umich.edu
11627977Shsul@eecs.umich.edu   case CONSCB_READ:
11637977Shsul@eecs.umich.edu      DeviceOperation(a0,a1,a2,a3,a4);
11647977Shsul@eecs.umich.edu      break;
11657979Sbinkertn@umich.edu
11667977Shsul@eecs.umich.edu   case CONSCB_CLOSE:
11677977Shsul@eecs.umich.edu      break;
11687982Ssaidi@eecs.umich.edu   case CONSCB_OPEN_CONSOLE:
11697982Ssaidi@eecs.umich.edu      printf("CONSOLE OPEN\n");
11707982Ssaidi@eecs.umich.edu      return 0; /* success */
11717982Ssaidi@eecs.umich.edu      break; /* not rearched */
11727982Ssaidi@eecs.umich.edu   case CONSCB_CLOSE_CONSOLE:
11737982Ssaidi@eecs.umich.edu      printf("CONSOLE CLOSE\n");
11747982Ssaidi@eecs.umich.edu      return 0; /* success */
11757982Ssaidi@eecs.umich.edu      break; /* not reached */
11767979Sbinkertn@umich.edu
11777977Shsul@eecs.umich.edu   default:
11787979Sbinkertn@umich.edu      panic("cher (%x,%x,%x,%x)\n", a0, a1, a2, a3);
11797977Shsul@eecs.umich.edu   }
11807979Sbinkertn@umich.edu
11817977Shsul@eecs.umich.edu   return 0;
11827977Shsul@eecs.umich.edu}
11837977Shsul@eecs.umich.edu
11847977Shsul@eecs.umich.edulong CallBackFixup(int a0, int a1, int a2)
11857977Shsul@eecs.umich.edu{
11867985Ssaidi@eecs.umich.edu   long temp;
11877985Ssaidi@eecs.umich.edu   /* Linux uses r8 for the current pointer (pointer to data structure
11887985Ssaidi@eecs.umich.edu      contating info about currently running process). It is set when the
11897985Ssaidi@eecs.umich.edu      kernel starts and is expected to remain there... Problem is that the
11907985Ssaidi@eecs.umich.edu      unlike the kernel, the console does not prevent the assembler from
11917985Ssaidi@eecs.umich.edu      using r8. So here is a work around. So far this has only been a problem
11927985Ssaidi@eecs.umich.edu      in CallBackFixup() but any other call back functions could cause a problem
11937985Ssaidi@eecs.umich.edu      at some point */
11947985Ssaidi@eecs.umich.edu
11957985Ssaidi@eecs.umich.edu   /* save off the current pointer to a temp variable */
11967985Ssaidi@eecs.umich.edu   asm("bis $8, $31, %0" : "=r" (temp));
11977985Ssaidi@eecs.umich.edu
11987985Ssaidi@eecs.umich.edu   /* call original code */
11997985Ssaidi@eecs.umich.edu   printf("CallbackFixup %x %x, t7=%x\n",a0,a1,temp);
12007985Ssaidi@eecs.umich.edu
12017985Ssaidi@eecs.umich.edu   /* restore the current pointer */
12027985Ssaidi@eecs.umich.edu   asm("bis %0, $31, $8" : : "r" (temp) : "$8");
12037977Shsul@eecs.umich.edu
12047977Shsul@eecs.umich.edu#if 0
12057977Shsul@eecs.umich.edu  if (first[FIRST(a1)]==0) {
12067977Shsul@eecs.umich.edu      first[FIRST(a1)] = KPTE(PFN(reservedFixup));
12077977Shsul@eecs.umich.edu   } else {
12087977Shsul@eecs.umich.edu      panic("CallBakcfixup\n");
12097977Shsul@eecs.umich.edu   }
12107977Shsul@eecs.umich.edu   second[SECOND(a1)] = KPTE(PFN(third_rpb));	/* Region 0 */
12117977Shsul@eecs.umich.edu   printf("Fixup: FISRT(a1)=0x%x SECOND(a1)=0x%x THIRD(a1)=0x%x\n",
12127977Shsul@eecs.umich.edu          FIRST(a1),SECOND(a1),THIRD(a1));
12137977Shsul@eecs.umich.edu
12147977Shsul@eecs.umich.edu#endif
12157977Shsul@eecs.umich.edu   return 0;
12167977Shsul@eecs.umich.edu}
12177977Shsul@eecs.umich.edu
12187977Shsul@eecs.umich.edu
12197977Shsul@eecs.umich.edu
12207977Shsul@eecs.umich.edu
12217977Shsul@eecs.umich.edu
12227977Shsul@eecs.umich.eduvoid SlaveCmd(int cpu, struct rpb_percpu *my_rpb)
12237977Shsul@eecs.umich.edu{
12247977Shsul@eecs.umich.edu/*   extern void palJToSlave[]; */
12257977Shsul@eecs.umich.edu   extern unsigned int palJToSlave[];
12267977Shsul@eecs.umich.edu
12277977Shsul@eecs.umich.edu
12287977Shsul@eecs.umich.edu   my_rpb->rpb_state |= STATE_BIP;
12297977Shsul@eecs.umich.edu   my_rpb->rpb_state &= ~STATE_RC;
12307977Shsul@eecs.umich.edu
12317977Shsul@eecs.umich.edu   SpinLock(&theLock);
12327977Shsul@eecs.umich.edu   printf("SlaveCmd: restart %x %x vptb %x my_rpb %x my_rpb_phys %x\n",
12337977Shsul@eecs.umich.edu          rpb->rpb_restart,
12347977Shsul@eecs.umich.edu          rpb->rpb_restart_pv,
12357977Shsul@eecs.umich.edu          rpb->rpb_vptb, my_rpb,
12367977Shsul@eecs.umich.edu          KSEG_TO_PHYS(my_rpb));
12377977Shsul@eecs.umich.edu   SpinUnlock(&theLock);
12387977Shsul@eecs.umich.edu
12397977Shsul@eecs.umich.edu   cServe(KSEG_TO_PHYS((ul)palJToSlave),
12407977Shsul@eecs.umich.edu          (ul)rpb->rpb_restart,
12417977Shsul@eecs.umich.edu          CSERVE_K_JTOPAL,
12427977Shsul@eecs.umich.edu          rpb->rpb_restart_pv,
12437977Shsul@eecs.umich.edu          rpb->rpb_vptb,
12447977Shsul@eecs.umich.edu          KSEG_TO_PHYS(my_rpb));
12457977Shsul@eecs.umich.edu}
12467977Shsul@eecs.umich.edu
12477977Shsul@eecs.umich.eduvoid SlaveLoop( int cpu)
12487977Shsul@eecs.umich.edu{
12497977Shsul@eecs.umich.edu   int size = ROUNDUP128(sizeof(struct rpb_percpu));
12507977Shsul@eecs.umich.edu   struct rpb_percpu *my_rpb = (struct rpb_percpu*)
12517977Shsul@eecs.umich.edu      ((ul)rpb_percpu + size*cpu);
12527977Shsul@eecs.umich.edu
12537977Shsul@eecs.umich.edu
12547977Shsul@eecs.umich.edu   SpinLock(&theLock);
12557977Shsul@eecs.umich.edu   if (cpu==0) {
12567977Shsul@eecs.umich.edu      panic("CPU�0 entering slaveLoop. Reenetering the console. HOSED \n");
12577977Shsul@eecs.umich.edu   } else {
12587977Shsul@eecs.umich.edu      printf("Entering slaveloop for cpu %d my_rpb=%x \n",cpu,my_rpb);
12597977Shsul@eecs.umich.edu   }
12607977Shsul@eecs.umich.edu   SpinUnlock(&theLock);
12617977Shsul@eecs.umich.edu   while(1) {
12627977Shsul@eecs.umich.edu      int i;
12637977Shsul@eecs.umich.edu      for (i=0; i < 1000000 ; i++) {
12647977Shsul@eecs.umich.edu         if (my_rpb->rpb_iccb.iccb_rxlen) {
12657977Shsul@eecs.umich.edu            SpinLock(&theLock);
12667977Shsul@eecs.umich.edu            printf("Slave CPU %d console command %s",
12677977Shsul@eecs.umich.edu                   cpu,my_rpb->rpb_iccb.iccb_rxbuf);
12687977Shsul@eecs.umich.edu            SpinUnlock(&theLock);
12697977Shsul@eecs.umich.edu            SlaveCmd(cpu,my_rpb);
12707977Shsul@eecs.umich.edu            panic("SlaveCmd returned \n");
12717977Shsul@eecs.umich.edu         }
12727977Shsul@eecs.umich.edu      }
12737977Shsul@eecs.umich.edu      printf("*");
12747977Shsul@eecs.umich.edu   }
12757977Shsul@eecs.umich.edu}
12767977Shsul@eecs.umich.edu
1277