exec.c 785 B

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