l.s 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. #include "mem.h"
  2. #define PADDR(a) ((a) & ~KZERO)
  3. #define KADDR(a) (KZERO|(a))
  4. /*
  5. * Some machine instructions not handled by 8[al].
  6. */
  7. #define OP16 BYTE $0x66
  8. #define DELAY BYTE $0xEB; BYTE $0x00 /* JMP .+2 */
  9. #define CPUID BYTE $0x0F; BYTE $0xA2 /* CPUID, argument in AX */
  10. #define WRMSR BYTE $0x0F; BYTE $0x30 /* WRMSR, argument in AX/DX (lo/hi) */
  11. #define RDTSC BYTE $0x0F; BYTE $0x31 /* RDTSC, result in AX/DX (lo/hi) */
  12. #define RDMSR BYTE $0x0F; BYTE $0x32 /* RDMSR, result in AX/DX (lo/hi) */
  13. #define HLT BYTE $0xF4
  14. /*
  15. * Macros for calculating offsets within the page directory base
  16. * and page tables. Note that these are assembler-specific hence
  17. * the '<<2'.
  18. */
  19. #define PDO(a) (((((a))>>22) & 0x03FF)<<2)
  20. #define PTO(a) (((((a))>>12) & 0x03FF)<<2)
  21. /*
  22. * For backwards compatiblity with 9load - should go away when 9load is changed
  23. * 9load currently sets up the mmu, however the first 16MB of memory is identity
  24. * mapped, so behave as if the mmu was not setup
  25. */
  26. TEXT _start0x80100020(SB), $0
  27. MOVL $_start0x00100020(SB), AX
  28. ANDL $~KZERO, AX
  29. JMP* AX
  30. /*
  31. * In protected mode with paging turned off and segment registers setup to linear map all memory.
  32. * Entered via a jump to 0x00100020, the physical address of the virtual kernel entry point of 0x80100020
  33. * Make the basic page tables for processor 0. Four pages are needed for the basic set:
  34. * a page directory, a page table for mapping the first 4MB of physical memory to KZERO,
  35. * and virtual and physical pages for mapping the Mach structure.
  36. * The remaining PTEs will be allocated later when memory is sized.
  37. * An identity mmu map is also needed for the switch to virtual mode. This
  38. * identity mapping is removed once the MMU is going and the JMP has been made
  39. * to virtual memory.
  40. */
  41. TEXT _start0x00100020(SB), $0
  42. CLI /* make sure interrupts are off */
  43. /* set up the gdt so we have sane plan 9 style gdts. */
  44. MOVL $tgdtptr(SB), AX
  45. ANDL $~KZERO, AX
  46. MOVL (AX), GDTR
  47. MOVW $1, AX
  48. MOVW AX, MSW
  49. /* clear prefetch queue (weird code to avoid optimizations) */
  50. DELAY
  51. /* set segs to something sane (avoid traps later) */
  52. MOVW $(1<<3), AX
  53. MOVW AX, DS
  54. MOVW AX, SS
  55. MOVW AX, ES
  56. MOVW AX, FS
  57. MOVW AX, GS
  58. /* JMP $(2<<3):$mode32bit(SB) /**/
  59. BYTE $0xEA
  60. LONG $mode32bit-KZERO(SB)
  61. WORD $(2<<3)
  62. /*
  63. * gdt to get us to 32-bit/segmented/unpaged mode
  64. */
  65. TEXT tgdt(SB), $0
  66. /* null descriptor */
  67. LONG $0
  68. LONG $0
  69. /* data segment descriptor for 4 gigabytes (PL 0) */
  70. LONG $(0xFFFF)
  71. LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
  72. /* exec segment descriptor for 4 gigabytes (PL 0) */
  73. LONG $(0xFFFF)
  74. LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
  75. /*
  76. * pointer to initial gdt
  77. * Note the -KZERO which puts the physical address in the gdtptr.
  78. * that's needed as we start executing in physical addresses.
  79. */
  80. TEXT tgdtptr(SB), $0
  81. WORD $(3*8)
  82. LONG $tgdt-KZERO(SB)
  83. TEXT mode32bit(SB), $0
  84. /* At this point, the GDT setup is done. */
  85. MOVL $PADDR(CPU0PDB), DI /* clear 4 pages for the tables etc. */
  86. XORL AX, AX
  87. MOVL $(4*BY2PG), CX
  88. SHRL $2, CX
  89. CLD
  90. REP; STOSL
  91. MOVL $PADDR(CPU0PDB), AX
  92. ADDL $PDO(KZERO), AX /* page directory offset for KZERO */
  93. MOVL $PADDR(CPU0PTE), (AX) /* PTE's for 0x80000000 */
  94. MOVL $(PTEWRITE|PTEVALID), BX /* page permissions */
  95. ORL BX, (AX)
  96. MOVL $PADDR(CPU0PTE), AX /* first page of page table */
  97. MOVL $1024, CX /* 1024 pages in 4MB */
  98. _setpte:
  99. MOVL BX, (AX)
  100. ADDL $(1<<PGSHIFT), BX
  101. ADDL $4, AX
  102. LOOP _setpte
  103. MOVL $PADDR(CPU0PTE), AX
  104. ADDL $PTO(MACHADDR), AX /* page table entry offset for MACHADDR */
  105. MOVL $PADDR(CPU0MACH), (AX) /* PTE for Mach */
  106. MOVL $(PTEWRITE|PTEVALID), BX /* page permissions */
  107. ORL BX, (AX)
  108. /*
  109. * Now ready to use the new map. Make sure the processor options are what is wanted.
  110. * It is necessary on some processors to immediately follow mode switching with a JMP instruction
  111. * to clear the prefetch queues.
  112. */
  113. MOVL $PADDR(CPU0PDB), CX /* load address of page directory */
  114. MOVL (PDO(KZERO))(CX), DX /* double-map KZERO at 0 */
  115. MOVL DX, (PDO(0))(CX)
  116. MOVL CX, CR3
  117. DELAY /* JMP .+2 */
  118. MOVL CR0, DX
  119. ORL $0x80010000, DX /* PG|WP */
  120. ANDL $~0x6000000A, DX /* ~(CD|NW|TS|MP) */
  121. MOVL $_startpg(SB), AX /* this is a virtual address */
  122. MOVL DX, CR0 /* turn on paging */
  123. JMP* AX /* jump to the virtual nirvana */
  124. /*
  125. * Basic machine environment set, can clear BSS and create a stack.
  126. * The stack starts at the top of the page containing the Mach structure.
  127. * The x86 architecture forces the use of the same virtual address for
  128. * each processor's Mach structure, so the global Mach pointer 'm' can
  129. * be initialised here.
  130. */
  131. TEXT _startpg(SB), $0
  132. MOVL $0, (PDO(0))(CX) /* undo double-map of KZERO at 0 */
  133. MOVL CX, CR3 /* load and flush the mmu */
  134. _clearbss:
  135. MOVL $edata(SB), DI
  136. XORL AX, AX
  137. MOVL $end(SB), CX
  138. SUBL DI, CX /* end-edata bytes */
  139. SHRL $2, CX /* end-edata doublewords */
  140. CLD
  141. REP; STOSL /* clear BSS */
  142. MOVL $MACHADDR, SP
  143. MOVL SP, m(SB) /* initialise global Mach pointer */
  144. MOVL $0, 0(SP) /* initialise m->machno */
  145. ADDL $(MACHSIZE-4), SP /* initialise stack */
  146. /*
  147. * Need to do one final thing to ensure a clean machine environment,
  148. * clear the EFLAGS register, which can only be done once there is a stack.
  149. */
  150. MOVL $0, AX
  151. PUSHL AX
  152. POPFL
  153. CALL main(SB)
  154. /*
  155. * Park a processor. Should never fall through a return from main to here,
  156. * should only be called by application processors when shutting down.
  157. */
  158. TEXT idle(SB), $0
  159. _idle:
  160. STI
  161. HLT
  162. JMP _idle
  163. /*
  164. * Port I/O.
  165. * in[bsl] input a byte|short|long
  166. * ins[bsl] input a string of bytes|shorts|longs
  167. * out[bsl] output a byte|short|long
  168. * outs[bsl] output a string of bytes|shorts|longs
  169. */
  170. TEXT inb(SB), $0
  171. MOVL port+0(FP), DX
  172. XORL AX, AX
  173. INB
  174. RET
  175. TEXT insb(SB), $0
  176. MOVL port+0(FP), DX
  177. MOVL address+4(FP), DI
  178. MOVL count+8(FP), CX
  179. CLD
  180. REP; INSB
  181. RET
  182. TEXT ins(SB), $0
  183. MOVL port+0(FP), DX
  184. XORL AX, AX
  185. OP16; INL
  186. RET
  187. TEXT inss(SB), $0
  188. MOVL port+0(FP), DX
  189. MOVL address+4(FP), DI
  190. MOVL count+8(FP), CX
  191. CLD
  192. REP; OP16; INSL
  193. RET
  194. TEXT inl(SB), $0
  195. MOVL port+0(FP), DX
  196. INL
  197. RET
  198. TEXT insl(SB), $0
  199. MOVL port+0(FP), DX
  200. MOVL address+4(FP), DI
  201. MOVL count+8(FP), CX
  202. CLD
  203. REP; INSL
  204. RET
  205. TEXT outb(SB), $0
  206. MOVL port+0(FP), DX
  207. MOVL byte+4(FP), AX
  208. OUTB
  209. RET
  210. TEXT outsb(SB), $0
  211. MOVL port+0(FP), DX
  212. MOVL address+4(FP), SI
  213. MOVL count+8(FP), CX
  214. CLD
  215. REP; OUTSB
  216. RET
  217. TEXT outs(SB), $0
  218. MOVL port+0(FP), DX
  219. MOVL short+4(FP), AX
  220. OP16; OUTL
  221. RET
  222. TEXT outss(SB), $0
  223. MOVL port+0(FP), DX
  224. MOVL address+4(FP), SI
  225. MOVL count+8(FP), CX
  226. CLD
  227. REP; OP16; OUTSL
  228. RET
  229. TEXT outl(SB), $0
  230. MOVL port+0(FP), DX
  231. MOVL long+4(FP), AX
  232. OUTL
  233. RET
  234. TEXT outsl(SB), $0
  235. MOVL port+0(FP), DX
  236. MOVL address+4(FP), SI
  237. MOVL count+8(FP), CX
  238. CLD
  239. REP; OUTSL
  240. RET
  241. /*
  242. * Read/write various system registers.
  243. * CR4 and the 'model specific registers' should only be read/written
  244. * after it has been determined the processor supports them
  245. */
  246. TEXT lgdt(SB), $0 /* GDTR - global descriptor table */
  247. MOVL gdtptr+0(FP), AX
  248. MOVL (AX), GDTR
  249. RET
  250. TEXT lidt(SB), $0 /* IDTR - interrupt descriptor table */
  251. MOVL idtptr+0(FP), AX
  252. MOVL (AX), IDTR
  253. RET
  254. TEXT ltr(SB), $0 /* TR - task register */
  255. MOVL tptr+0(FP), AX
  256. MOVW AX, TASK
  257. RET
  258. TEXT getcr0(SB), $0 /* CR0 - processor control */
  259. MOVL CR0, AX
  260. RET
  261. TEXT getcr2(SB), $0 /* CR2 - page fault linear address */
  262. MOVL CR2, AX
  263. RET
  264. TEXT getcr3(SB), $0 /* CR3 - page directory base */
  265. MOVL CR3, AX
  266. RET
  267. TEXT putcr3(SB), $0
  268. MOVL cr3+0(FP), AX
  269. MOVL AX, CR3
  270. RET
  271. TEXT getcr4(SB), $0 /* CR4 - extensions */
  272. MOVL CR4, AX
  273. RET
  274. TEXT putcr4(SB), $0
  275. MOVL cr4+0(FP), AX
  276. MOVL AX, CR4
  277. RET
  278. TEXT _cycles(SB), $0 /* time stamp counter; cycles since power up */
  279. RDTSC
  280. MOVL vlong+0(FP), CX /* &vlong */
  281. MOVL AX, 0(CX) /* lo */
  282. MOVL DX, 4(CX) /* hi */
  283. RET
  284. TEXT rdmsr(SB), $0 /* model-specific register */
  285. MOVL index+0(FP), CX
  286. RDMSR
  287. MOVL vlong+4(FP), CX /* &vlong */
  288. MOVL AX, 0(CX) /* lo */
  289. MOVL DX, 4(CX) /* hi */
  290. RET
  291. TEXT wrmsr(SB), $0
  292. MOVL index+0(FP), CX
  293. MOVL lo+4(FP), AX
  294. MOVL hi+8(FP), DX
  295. WRMSR
  296. RET
  297. /*
  298. * Try to determine the CPU type which requires fiddling with EFLAGS.
  299. * If the Id bit can be toggled then the CPUID instruciton can be used
  300. * to determine CPU identity and features. First have to check if it's
  301. * a 386 (Ac bit can't be set). If it's not a 386 and the Id bit can't be
  302. * toggled then it's an older 486 of some kind.
  303. *
  304. * cpuid(id[], &ax, &dx);
  305. */
  306. TEXT cpuid(SB), $0
  307. MOVL $0x240000, AX
  308. PUSHL AX
  309. POPFL /* set Id|Ac */
  310. PUSHFL
  311. POPL BX /* retrieve value */
  312. MOVL $0, AX
  313. PUSHL AX
  314. POPFL /* clear Id|Ac, EFLAGS initialised */
  315. PUSHFL
  316. POPL AX /* retrieve value */
  317. XORL BX, AX
  318. TESTL $0x040000, AX /* Ac */
  319. JZ _cpu386 /* can't set this bit on 386 */
  320. TESTL $0x200000, AX /* Id */
  321. JZ _cpu486 /* can't toggle this bit on some 486 */
  322. MOVL $0, AX
  323. CPUID
  324. MOVL id+0(FP), BP
  325. MOVL BX, 0(BP) /* "Genu" "Auth" "Cyri" */
  326. MOVL DX, 4(BP) /* "ineI" "enti" "xIns" */
  327. MOVL CX, 8(BP) /* "ntel" "cAMD" "tead" */
  328. MOVL $1, AX
  329. CPUID
  330. JMP _cpuid
  331. _cpu486:
  332. MOVL $0x400, AX
  333. MOVL $0, DX
  334. JMP _cpuid
  335. _cpu386:
  336. MOVL $0x300, AX
  337. MOVL $0, DX
  338. _cpuid:
  339. MOVL ax+4(FP), BP
  340. MOVL AX, 0(BP)
  341. MOVL dx+8(FP), BP
  342. MOVL DX, 0(BP)
  343. RET
  344. /*
  345. * Basic timing loop to determine CPU frequency.
  346. */
  347. TEXT aamloop(SB), $0
  348. MOVL count+0(FP), CX
  349. _aamloop:
  350. AAM
  351. LOOP _aamloop
  352. RET
  353. /*
  354. * Floating point.
  355. */
  356. #define FPOFF ;\
  357. WAIT ;\
  358. MOVL CR0, AX ;\
  359. ANDL $~0x4, AX /* EM=0 */ ;\
  360. ORL $0x28, AX /* NE=1, TS=1 */ ;\
  361. MOVL AX, CR0
  362. #define FPON ;\
  363. MOVL CR0, AX ;\
  364. ANDL $~0xC, AX /* EM=0, TS=0 */ ;\
  365. MOVL AX, CR0
  366. TEXT fpoff(SB), $0 /* disable */
  367. FPOFF
  368. RET
  369. TEXT fpinit(SB), $0 /* enable and init */
  370. FPON
  371. FINIT
  372. WAIT
  373. /* setfcr(FPPDBL|FPRNR|FPINVAL|FPZDIV|FPOVFL) */
  374. /* note that low 6 bits are masks, not enables, on this chip */
  375. PUSHW $0x0232
  376. FLDCW 0(SP)
  377. POPW AX
  378. WAIT
  379. RET
  380. TEXT fpsave(SB), $0 /* save state and disable */
  381. MOVL p+0(FP), AX
  382. FSAVE 0(AX) /* no WAIT */
  383. FPOFF
  384. RET
  385. TEXT fprestore(SB), $0 /* enable and restore state */
  386. FPON
  387. MOVL p+0(FP), AX
  388. FRSTOR 0(AX)
  389. WAIT
  390. RET
  391. TEXT fpstatus(SB), $0 /* get floating point status */
  392. FSTSW AX
  393. RET
  394. TEXT fpenv(SB), $0 /* save state without waiting */
  395. MOVL p+0(FP), AX
  396. FSTENV 0(AX)
  397. RET
  398. /*
  399. */
  400. TEXT splhi(SB), $0
  401. MOVL $(MACHADDR+0x04), AX /* save PC in m->splpc */
  402. MOVL (SP), BX
  403. MOVL BX, (AX)
  404. PUSHFL
  405. POPL AX
  406. CLI
  407. RET
  408. TEXT spllo(SB), $0
  409. PUSHFL
  410. POPL AX
  411. STI
  412. RET
  413. TEXT splx(SB), $0
  414. MOVL $(MACHADDR+0x04), AX /* save PC in m->splpc */
  415. MOVL (SP), BX
  416. MOVL BX, (AX)
  417. /*FALLTHROUGH*/
  418. TEXT splxpc(SB), $0 /* for iunlock */
  419. MOVL s+0(FP), AX
  420. PUSHL AX
  421. POPFL
  422. RET
  423. TEXT spldone(SB), $0
  424. RET
  425. TEXT islo(SB), $0
  426. PUSHFL
  427. POPL AX
  428. ANDL $0x200, AX /* interrupt enable flag */
  429. RET
  430. /*
  431. * Test-And-Set
  432. */
  433. TEXT tas(SB), $0
  434. MOVL $0xDEADDEAD, AX
  435. MOVL lock+0(FP), BX
  436. XCHGL AX, (BX) /* lock->key */
  437. RET
  438. TEXT _xinc(SB), $0 /* void _xinc(long*); */
  439. MOVL l+0(FP), AX
  440. LOCK; INCL 0(AX)
  441. RET
  442. TEXT _xdec(SB), $0 /* long _xdec(long*); */
  443. MOVL l+0(FP), BX
  444. XORL AX, AX
  445. LOCK; DECL 0(BX)
  446. JLT _xdeclt
  447. JGT _xdecgt
  448. RET
  449. _xdecgt:
  450. INCL AX
  451. RET
  452. _xdeclt:
  453. DECL AX
  454. RET
  455. TEXT mb386(SB), $0
  456. POPL AX /* return PC */
  457. PUSHFL
  458. PUSHL CS
  459. PUSHL AX
  460. IRETL
  461. TEXT mb586(SB), $0
  462. XORL AX, AX
  463. CPUID
  464. RET
  465. TEXT xchgw(SB), $0
  466. MOVL v+4(FP), AX
  467. MOVL p+0(FP), BX
  468. XCHGW AX, (BX)
  469. RET
  470. TEXT mul64fract(SB), $0
  471. MOVL r+0(FP), CX
  472. XORL BX, BX /* BX = 0 */
  473. MOVL a+8(FP), AX
  474. MULL b+16(FP) /* a1*b1 */
  475. MOVL AX, 4(CX) /* r2 = lo(a1*b1) */
  476. MOVL a+8(FP), AX
  477. MULL b+12(FP) /* a1*b0 */
  478. MOVL AX, 0(CX) /* r1 = lo(a1*b0) */
  479. ADDL DX, 4(CX) /* r2 += hi(a1*b0) */
  480. MOVL a+4(FP), AX
  481. MULL b+16(FP) /* a0*b1 */
  482. ADDL AX, 0(CX) /* r1 += lo(a0*b1) */
  483. ADCL DX, 4(CX) /* r2 += hi(a0*b1) + carry */
  484. MOVL a+4(FP), AX
  485. MULL b+12(FP) /* a0*b0 */
  486. ADDL DX, 0(CX) /* r1 += hi(a0*b0) */
  487. ADCL BX, 4(CX) /* r2 += carry */
  488. RET
  489. /*
  490. * label consists of a stack pointer and a PC
  491. */
  492. TEXT gotolabel(SB), $0
  493. MOVL label+0(FP), AX
  494. MOVL 0(AX), SP /* restore sp */
  495. MOVL 4(AX), AX /* put return pc on the stack */
  496. MOVL AX, 0(SP)
  497. MOVL $1, AX /* return 1 */
  498. RET
  499. TEXT setlabel(SB), $0
  500. MOVL label+0(FP), AX
  501. MOVL SP, 0(AX) /* store sp */
  502. MOVL 0(SP), BX /* store return pc */
  503. MOVL BX, 4(AX)
  504. MOVL $0, AX /* return 0 */
  505. RET
  506. /*
  507. * Attempt at power saving. -rsc
  508. */
  509. TEXT halt(SB), $0
  510. CLI
  511. CMPL nrdy(SB), $0
  512. JEQ _nothingready
  513. STI
  514. RET
  515. _nothingready:
  516. STI
  517. HLT
  518. RET
  519. /*
  520. * Interrupt/exception handling.
  521. * Each entry in the vector table calls either _strayintr or _strayintrx depending
  522. * on whether an error code has been automatically pushed onto the stack
  523. * (_strayintrx) or not, in which case a dummy entry must be pushed before retrieving
  524. * the trap type from the vector table entry and placing it on the stack as part
  525. * of the Ureg structure.
  526. * The size of each entry in the vector table (6 bytes) is known in trapinit().
  527. */
  528. TEXT _strayintr(SB), $0
  529. PUSHL AX /* save AX */
  530. MOVL 4(SP), AX /* return PC from vectortable(SB) */
  531. JMP intrcommon
  532. TEXT _strayintrx(SB), $0
  533. XCHGL AX, (SP) /* swap AX with vectortable CALL PC */
  534. intrcommon:
  535. PUSHL DS /* save DS */
  536. PUSHL $(KDSEL)
  537. POPL DS /* fix up DS */
  538. MOVBLZX (AX), AX /* trap type -> AX */
  539. XCHGL AX, 4(SP) /* exchange trap type with saved AX */
  540. PUSHL ES /* save ES */
  541. PUSHL $(KDSEL)
  542. POPL ES /* fix up ES */
  543. PUSHL FS /* save the rest of the Ureg struct */
  544. PUSHL GS
  545. PUSHAL
  546. PUSHL SP /* Ureg* argument to trap */
  547. CALL trap(SB)
  548. TEXT forkret(SB), $0
  549. POPL AX
  550. POPAL
  551. POPL GS
  552. POPL FS
  553. POPL ES
  554. POPL DS
  555. ADDL $8, SP /* pop error code and trap type */
  556. IRETL
  557. TEXT vectortable(SB), $0
  558. CALL _strayintr(SB); BYTE $0x00 /* divide error */
  559. CALL _strayintr(SB); BYTE $0x01 /* debug exception */
  560. CALL _strayintr(SB); BYTE $0x02 /* NMI interrupt */
  561. CALL _strayintr(SB); BYTE $0x03 /* breakpoint */
  562. CALL _strayintr(SB); BYTE $0x04 /* overflow */
  563. CALL _strayintr(SB); BYTE $0x05 /* bound */
  564. CALL _strayintr(SB); BYTE $0x06 /* invalid opcode */
  565. CALL _strayintr(SB); BYTE $0x07 /* no coprocessor available */
  566. CALL _strayintrx(SB); BYTE $0x08 /* double fault */
  567. CALL _strayintr(SB); BYTE $0x09 /* coprocessor segment overflow */
  568. CALL _strayintrx(SB); BYTE $0x0A /* invalid TSS */
  569. CALL _strayintrx(SB); BYTE $0x0B /* segment not available */
  570. CALL _strayintrx(SB); BYTE $0x0C /* stack exception */
  571. CALL _strayintrx(SB); BYTE $0x0D /* general protection error */
  572. CALL _strayintrx(SB); BYTE $0x0E /* page fault */
  573. CALL _strayintr(SB); BYTE $0x0F /* */
  574. CALL _strayintr(SB); BYTE $0x10 /* coprocessor error */
  575. CALL _strayintrx(SB); BYTE $0x11 /* alignment check */
  576. CALL _strayintr(SB); BYTE $0x12 /* machine check */
  577. CALL _strayintr(SB); BYTE $0x13
  578. CALL _strayintr(SB); BYTE $0x14
  579. CALL _strayintr(SB); BYTE $0x15
  580. CALL _strayintr(SB); BYTE $0x16
  581. CALL _strayintr(SB); BYTE $0x17
  582. CALL _strayintr(SB); BYTE $0x18
  583. CALL _strayintr(SB); BYTE $0x19
  584. CALL _strayintr(SB); BYTE $0x1A
  585. CALL _strayintr(SB); BYTE $0x1B
  586. CALL _strayintr(SB); BYTE $0x1C
  587. CALL _strayintr(SB); BYTE $0x1D
  588. CALL _strayintr(SB); BYTE $0x1E
  589. CALL _strayintr(SB); BYTE $0x1F
  590. CALL _strayintr(SB); BYTE $0x20 /* VectorLAPIC */
  591. CALL _strayintr(SB); BYTE $0x21
  592. CALL _strayintr(SB); BYTE $0x22
  593. CALL _strayintr(SB); BYTE $0x23
  594. CALL _strayintr(SB); BYTE $0x24
  595. CALL _strayintr(SB); BYTE $0x25
  596. CALL _strayintr(SB); BYTE $0x26
  597. CALL _strayintr(SB); BYTE $0x27
  598. CALL _strayintr(SB); BYTE $0x28
  599. CALL _strayintr(SB); BYTE $0x29
  600. CALL _strayintr(SB); BYTE $0x2A
  601. CALL _strayintr(SB); BYTE $0x2B
  602. CALL _strayintr(SB); BYTE $0x2C
  603. CALL _strayintr(SB); BYTE $0x2D
  604. CALL _strayintr(SB); BYTE $0x2E
  605. CALL _strayintr(SB); BYTE $0x2F
  606. CALL _strayintr(SB); BYTE $0x30
  607. CALL _strayintr(SB); BYTE $0x31
  608. CALL _strayintr(SB); BYTE $0x32
  609. CALL _strayintr(SB); BYTE $0x33
  610. CALL _strayintr(SB); BYTE $0x34
  611. CALL _strayintr(SB); BYTE $0x35
  612. CALL _strayintr(SB); BYTE $0x36
  613. CALL _strayintr(SB); BYTE $0x37
  614. CALL _strayintr(SB); BYTE $0x38
  615. CALL _strayintr(SB); BYTE $0x39
  616. CALL _strayintr(SB); BYTE $0x3A
  617. CALL _strayintr(SB); BYTE $0x3B
  618. CALL _strayintr(SB); BYTE $0x3C
  619. CALL _strayintr(SB); BYTE $0x3D
  620. CALL _strayintr(SB); BYTE $0x3E
  621. CALL _strayintr(SB); BYTE $0x3F
  622. CALL _syscallintr(SB); BYTE $0x40 /* VectorSYSCALL */
  623. CALL _strayintr(SB); BYTE $0x41
  624. CALL _strayintr(SB); BYTE $0x42
  625. CALL _strayintr(SB); BYTE $0x43
  626. CALL _strayintr(SB); BYTE $0x44
  627. CALL _strayintr(SB); BYTE $0x45
  628. CALL _strayintr(SB); BYTE $0x46
  629. CALL _strayintr(SB); BYTE $0x47
  630. CALL _strayintr(SB); BYTE $0x48
  631. CALL _strayintr(SB); BYTE $0x49
  632. CALL _strayintr(SB); BYTE $0x4A
  633. CALL _strayintr(SB); BYTE $0x4B
  634. CALL _strayintr(SB); BYTE $0x4C
  635. CALL _strayintr(SB); BYTE $0x4D
  636. CALL _strayintr(SB); BYTE $0x4E
  637. CALL _strayintr(SB); BYTE $0x4F
  638. CALL _strayintr(SB); BYTE $0x50
  639. CALL _strayintr(SB); BYTE $0x51
  640. CALL _strayintr(SB); BYTE $0x52
  641. CALL _strayintr(SB); BYTE $0x53
  642. CALL _strayintr(SB); BYTE $0x54
  643. CALL _strayintr(SB); BYTE $0x55
  644. CALL _strayintr(SB); BYTE $0x56
  645. CALL _strayintr(SB); BYTE $0x57
  646. CALL _strayintr(SB); BYTE $0x58
  647. CALL _strayintr(SB); BYTE $0x59
  648. CALL _strayintr(SB); BYTE $0x5A
  649. CALL _strayintr(SB); BYTE $0x5B
  650. CALL _strayintr(SB); BYTE $0x5C
  651. CALL _strayintr(SB); BYTE $0x5D
  652. CALL _strayintr(SB); BYTE $0x5E
  653. CALL _strayintr(SB); BYTE $0x5F
  654. CALL _strayintr(SB); BYTE $0x60
  655. CALL _strayintr(SB); BYTE $0x61
  656. CALL _strayintr(SB); BYTE $0x62
  657. CALL _strayintr(SB); BYTE $0x63
  658. CALL _strayintr(SB); BYTE $0x64
  659. CALL _strayintr(SB); BYTE $0x65
  660. CALL _strayintr(SB); BYTE $0x66
  661. CALL _strayintr(SB); BYTE $0x67
  662. CALL _strayintr(SB); BYTE $0x68
  663. CALL _strayintr(SB); BYTE $0x69
  664. CALL _strayintr(SB); BYTE $0x6A
  665. CALL _strayintr(SB); BYTE $0x6B
  666. CALL _strayintr(SB); BYTE $0x6C
  667. CALL _strayintr(SB); BYTE $0x6D
  668. CALL _strayintr(SB); BYTE $0x6E
  669. CALL _strayintr(SB); BYTE $0x6F
  670. CALL _strayintr(SB); BYTE $0x70
  671. CALL _strayintr(SB); BYTE $0x71
  672. CALL _strayintr(SB); BYTE $0x72
  673. CALL _strayintr(SB); BYTE $0x73
  674. CALL _strayintr(SB); BYTE $0x74
  675. CALL _strayintr(SB); BYTE $0x75
  676. CALL _strayintr(SB); BYTE $0x76
  677. CALL _strayintr(SB); BYTE $0x77
  678. CALL _strayintr(SB); BYTE $0x78
  679. CALL _strayintr(SB); BYTE $0x79
  680. CALL _strayintr(SB); BYTE $0x7A
  681. CALL _strayintr(SB); BYTE $0x7B
  682. CALL _strayintr(SB); BYTE $0x7C
  683. CALL _strayintr(SB); BYTE $0x7D
  684. CALL _strayintr(SB); BYTE $0x7E
  685. CALL _strayintr(SB); BYTE $0x7F
  686. CALL _strayintr(SB); BYTE $0x80 /* Vector[A]PIC */
  687. CALL _strayintr(SB); BYTE $0x81
  688. CALL _strayintr(SB); BYTE $0x82
  689. CALL _strayintr(SB); BYTE $0x83
  690. CALL _strayintr(SB); BYTE $0x84
  691. CALL _strayintr(SB); BYTE $0x85
  692. CALL _strayintr(SB); BYTE $0x86
  693. CALL _strayintr(SB); BYTE $0x87
  694. CALL _strayintr(SB); BYTE $0x88
  695. CALL _strayintr(SB); BYTE $0x89
  696. CALL _strayintr(SB); BYTE $0x8A
  697. CALL _strayintr(SB); BYTE $0x8B
  698. CALL _strayintr(SB); BYTE $0x8C
  699. CALL _strayintr(SB); BYTE $0x8D
  700. CALL _strayintr(SB); BYTE $0x8E
  701. CALL _strayintr(SB); BYTE $0x8F
  702. CALL _strayintr(SB); BYTE $0x90
  703. CALL _strayintr(SB); BYTE $0x91
  704. CALL _strayintr(SB); BYTE $0x92
  705. CALL _strayintr(SB); BYTE $0x93
  706. CALL _strayintr(SB); BYTE $0x94
  707. CALL _strayintr(SB); BYTE $0x95
  708. CALL _strayintr(SB); BYTE $0x96
  709. CALL _strayintr(SB); BYTE $0x97
  710. CALL _strayintr(SB); BYTE $0x98
  711. CALL _strayintr(SB); BYTE $0x99
  712. CALL _strayintr(SB); BYTE $0x9A
  713. CALL _strayintr(SB); BYTE $0x9B
  714. CALL _strayintr(SB); BYTE $0x9C
  715. CALL _strayintr(SB); BYTE $0x9D
  716. CALL _strayintr(SB); BYTE $0x9E
  717. CALL _strayintr(SB); BYTE $0x9F
  718. CALL _strayintr(SB); BYTE $0xA0
  719. CALL _strayintr(SB); BYTE $0xA1
  720. CALL _strayintr(SB); BYTE $0xA2
  721. CALL _strayintr(SB); BYTE $0xA3
  722. CALL _strayintr(SB); BYTE $0xA4
  723. CALL _strayintr(SB); BYTE $0xA5
  724. CALL _strayintr(SB); BYTE $0xA6
  725. CALL _strayintr(SB); BYTE $0xA7
  726. CALL _strayintr(SB); BYTE $0xA8
  727. CALL _strayintr(SB); BYTE $0xA9
  728. CALL _strayintr(SB); BYTE $0xAA
  729. CALL _strayintr(SB); BYTE $0xAB
  730. CALL _strayintr(SB); BYTE $0xAC
  731. CALL _strayintr(SB); BYTE $0xAD
  732. CALL _strayintr(SB); BYTE $0xAE
  733. CALL _strayintr(SB); BYTE $0xAF
  734. CALL _strayintr(SB); BYTE $0xB0
  735. CALL _strayintr(SB); BYTE $0xB1
  736. CALL _strayintr(SB); BYTE $0xB2
  737. CALL _strayintr(SB); BYTE $0xB3
  738. CALL _strayintr(SB); BYTE $0xB4
  739. CALL _strayintr(SB); BYTE $0xB5
  740. CALL _strayintr(SB); BYTE $0xB6
  741. CALL _strayintr(SB); BYTE $0xB7
  742. CALL _strayintr(SB); BYTE $0xB8
  743. CALL _strayintr(SB); BYTE $0xB9
  744. CALL _strayintr(SB); BYTE $0xBA
  745. CALL _strayintr(SB); BYTE $0xBB
  746. CALL _strayintr(SB); BYTE $0xBC
  747. CALL _strayintr(SB); BYTE $0xBD
  748. CALL _strayintr(SB); BYTE $0xBE
  749. CALL _strayintr(SB); BYTE $0xBF
  750. CALL _strayintr(SB); BYTE $0xC0
  751. CALL _strayintr(SB); BYTE $0xC1
  752. CALL _strayintr(SB); BYTE $0xC2
  753. CALL _strayintr(SB); BYTE $0xC3
  754. CALL _strayintr(SB); BYTE $0xC4
  755. CALL _strayintr(SB); BYTE $0xC5
  756. CALL _strayintr(SB); BYTE $0xC6
  757. CALL _strayintr(SB); BYTE $0xC7
  758. CALL _strayintr(SB); BYTE $0xC8
  759. CALL _strayintr(SB); BYTE $0xC9
  760. CALL _strayintr(SB); BYTE $0xCA
  761. CALL _strayintr(SB); BYTE $0xCB
  762. CALL _strayintr(SB); BYTE $0xCC
  763. CALL _strayintr(SB); BYTE $0xCD
  764. CALL _strayintr(SB); BYTE $0xCE
  765. CALL _strayintr(SB); BYTE $0xCF
  766. CALL _strayintr(SB); BYTE $0xD0
  767. CALL _strayintr(SB); BYTE $0xD1
  768. CALL _strayintr(SB); BYTE $0xD2
  769. CALL _strayintr(SB); BYTE $0xD3
  770. CALL _strayintr(SB); BYTE $0xD4
  771. CALL _strayintr(SB); BYTE $0xD5
  772. CALL _strayintr(SB); BYTE $0xD6
  773. CALL _strayintr(SB); BYTE $0xD7
  774. CALL _strayintr(SB); BYTE $0xD8
  775. CALL _strayintr(SB); BYTE $0xD9
  776. CALL _strayintr(SB); BYTE $0xDA
  777. CALL _strayintr(SB); BYTE $0xDB
  778. CALL _strayintr(SB); BYTE $0xDC
  779. CALL _strayintr(SB); BYTE $0xDD
  780. CALL _strayintr(SB); BYTE $0xDE
  781. CALL _strayintr(SB); BYTE $0xDF
  782. CALL _strayintr(SB); BYTE $0xE0
  783. CALL _strayintr(SB); BYTE $0xE1
  784. CALL _strayintr(SB); BYTE $0xE2
  785. CALL _strayintr(SB); BYTE $0xE3
  786. CALL _strayintr(SB); BYTE $0xE4
  787. CALL _strayintr(SB); BYTE $0xE5
  788. CALL _strayintr(SB); BYTE $0xE6
  789. CALL _strayintr(SB); BYTE $0xE7
  790. CALL _strayintr(SB); BYTE $0xE8
  791. CALL _strayintr(SB); BYTE $0xE9
  792. CALL _strayintr(SB); BYTE $0xEA
  793. CALL _strayintr(SB); BYTE $0xEB
  794. CALL _strayintr(SB); BYTE $0xEC
  795. CALL _strayintr(SB); BYTE $0xED
  796. CALL _strayintr(SB); BYTE $0xEE
  797. CALL _strayintr(SB); BYTE $0xEF
  798. CALL _strayintr(SB); BYTE $0xF0
  799. CALL _strayintr(SB); BYTE $0xF1
  800. CALL _strayintr(SB); BYTE $0xF2
  801. CALL _strayintr(SB); BYTE $0xF3
  802. CALL _strayintr(SB); BYTE $0xF4
  803. CALL _strayintr(SB); BYTE $0xF5
  804. CALL _strayintr(SB); BYTE $0xF6
  805. CALL _strayintr(SB); BYTE $0xF7
  806. CALL _strayintr(SB); BYTE $0xF8
  807. CALL _strayintr(SB); BYTE $0xF9
  808. CALL _strayintr(SB); BYTE $0xFA
  809. CALL _strayintr(SB); BYTE $0xFB
  810. CALL _strayintr(SB); BYTE $0xFC
  811. CALL _strayintr(SB); BYTE $0xFD
  812. CALL _strayintr(SB); BYTE $0xFE
  813. CALL _strayintr(SB); BYTE $0xFF