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