blob: 9bc626f8cf00b1c0e4a5418a638fb6b98d42059f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#include "u.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "lib.h"
uchar pcbpage[64*1024+sizeof(PCB)];
PCB *pcb;
void (*kentry)(Bootconf*);
void
gokernel(void)
{
(*kentry)(&conf);
}
void
kexec(ulong entry)
{
uvlong pcbb, paltype;
pcb = (PCB*)(((ulong)pcbpage+0xffff) & ~0xffff); /* page align, even on 64K page Alphas */
memset(pcb, 0, sizeof(PCB));
pcb->ksp = (uvlong)&entry;
pcb->ptbr = getptbr();
pcb->fen = 1;
conf.pcb = pcb;
pcbb = paddr((uvlong)pcb);
kentry = (void(*)(Bootconf*))entry;
paltype = 2; /* OSF/1 please */
switch (swppal(paltype, (uvlong)gokernel, pcbb, hwrpb->vptb, pcb->ksp)) {
case 1:
panic("unknown PALcode variant");
case 2:
panic("PALcode variant not loaded");
default:
panic("weird return status from swppal");
}
}
|