l.s 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919
  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 instruction 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. shi:
  402. PUSHFL
  403. POPL AX
  404. TESTL $0x200, AX
  405. JZ alreadyhi
  406. MOVL $(MACHADDR+0x04), CX /* save PC in m->splpc */
  407. MOVL (SP), BX
  408. MOVL BX, (CX)
  409. alreadyhi:
  410. CLI
  411. RET
  412. TEXT spllo(SB), $0
  413. slo:
  414. PUSHFL
  415. POPL AX
  416. TESTL $0x200, AX
  417. JNZ alreadylo
  418. MOVL $(MACHADDR+0x04), CX /* clear m->splpc */
  419. MOVL $0, (CX)
  420. alreadylo:
  421. STI
  422. RET
  423. TEXT splx(SB), $0
  424. MOVL s+0(FP), AX
  425. TESTL $0x200, AX
  426. JNZ slo
  427. JMP shi
  428. TEXT spldone(SB), $0
  429. RET
  430. TEXT islo(SB), $0
  431. PUSHFL
  432. POPL AX
  433. ANDL $0x200, AX /* interrupt enable flag */
  434. RET
  435. /*
  436. * Test-And-Set
  437. */
  438. TEXT tas(SB), $0
  439. MOVL $0xDEADDEAD, AX
  440. MOVL lock+0(FP), BX
  441. XCHGL AX, (BX) /* lock->key */
  442. RET
  443. TEXT _xinc(SB), $0 /* void _xinc(long*); */
  444. MOVL l+0(FP), AX
  445. LOCK; INCL 0(AX)
  446. RET
  447. TEXT _xdec(SB), $0 /* long _xdec(long*); */
  448. MOVL l+0(FP), BX
  449. XORL AX, AX
  450. LOCK; DECL 0(BX)
  451. JLT _xdeclt
  452. JGT _xdecgt
  453. RET
  454. _xdecgt:
  455. INCL AX
  456. RET
  457. _xdeclt:
  458. DECL AX
  459. RET
  460. TEXT mb386(SB), $0
  461. POPL AX /* return PC */
  462. PUSHFL
  463. PUSHL CS
  464. PUSHL AX
  465. IRETL
  466. TEXT mb586(SB), $0
  467. XORL AX, AX
  468. CPUID
  469. RET
  470. TEXT xchgw(SB), $0
  471. MOVL v+4(FP), AX
  472. MOVL p+0(FP), BX
  473. XCHGW AX, (BX)
  474. RET
  475. TEXT mul64fract(SB), $0
  476. MOVL r+0(FP), CX
  477. XORL BX, BX /* BX = 0 */
  478. MOVL a+8(FP), AX
  479. MULL b+16(FP) /* a1*b1 */
  480. MOVL AX, 4(CX) /* r2 = lo(a1*b1) */
  481. MOVL a+8(FP), AX
  482. MULL b+12(FP) /* a1*b0 */
  483. MOVL AX, 0(CX) /* r1 = lo(a1*b0) */
  484. ADDL DX, 4(CX) /* r2 += hi(a1*b0) */
  485. MOVL a+4(FP), AX
  486. MULL b+16(FP) /* a0*b1 */
  487. ADDL AX, 0(CX) /* r1 += lo(a0*b1) */
  488. ADCL DX, 4(CX) /* r2 += hi(a0*b1) + carry */
  489. MOVL a+4(FP), AX
  490. MULL b+12(FP) /* a0*b0 */
  491. ADDL DX, 0(CX) /* r1 += hi(a0*b0) */
  492. ADCL BX, 4(CX) /* r2 += carry */
  493. RET
  494. /*
  495. * label consists of a stack pointer and a PC
  496. */
  497. TEXT gotolabel(SB), $0
  498. MOVL label+0(FP), AX
  499. MOVL 0(AX), SP /* restore sp */
  500. MOVL 4(AX), AX /* put return pc on the stack */
  501. MOVL AX, 0(SP)
  502. MOVL $1, AX /* return 1 */
  503. RET
  504. TEXT setlabel(SB), $0
  505. MOVL label+0(FP), AX
  506. MOVL SP, 0(AX) /* store sp */
  507. MOVL 0(SP), BX /* store return pc */
  508. MOVL BX, 4(AX)
  509. MOVL $0, AX /* return 0 */
  510. RET
  511. /*
  512. * Attempt at power saving. -rsc
  513. */
  514. TEXT halt(SB), $0
  515. CLI
  516. CMPL nrdy(SB), $0
  517. JEQ _nothingready
  518. STI
  519. RET
  520. _nothingready:
  521. STI
  522. HLT
  523. RET
  524. /*
  525. * Interrupt/exception handling.
  526. * Each entry in the vector table calls either _strayintr or _strayintrx depending
  527. * on whether an error code has been automatically pushed onto the stack
  528. * (_strayintrx) or not, in which case a dummy entry must be pushed before retrieving
  529. * the trap type from the vector table entry and placing it on the stack as part
  530. * of the Ureg structure.
  531. * The size of each entry in the vector table (6 bytes) is known in trapinit().
  532. */
  533. TEXT _strayintr(SB), $0
  534. PUSHL AX /* save AX */
  535. MOVL 4(SP), AX /* return PC from vectortable(SB) */
  536. JMP intrcommon
  537. TEXT _strayintrx(SB), $0
  538. XCHGL AX, (SP) /* swap AX with vectortable CALL PC */
  539. intrcommon:
  540. PUSHL DS /* save DS */
  541. PUSHL $(KDSEL)
  542. POPL DS /* fix up DS */
  543. MOVBLZX (AX), AX /* trap type -> AX */
  544. XCHGL AX, 4(SP) /* exchange trap type with saved AX */
  545. PUSHL ES /* save ES */
  546. PUSHL $(KDSEL)
  547. POPL ES /* fix up ES */
  548. PUSHL FS /* save the rest of the Ureg struct */
  549. PUSHL GS
  550. PUSHAL
  551. PUSHL SP /* Ureg* argument to trap */
  552. CALL trap(SB)
  553. TEXT forkret(SB), $0
  554. POPL AX
  555. POPAL
  556. POPL GS
  557. POPL FS
  558. POPL ES
  559. POPL DS
  560. ADDL $8, SP /* pop error code and trap type */
  561. IRETL
  562. TEXT vectortable(SB), $0
  563. CALL _strayintr(SB); BYTE $0x00 /* divide error */
  564. CALL _strayintr(SB); BYTE $0x01 /* debug exception */
  565. CALL _strayintr(SB); BYTE $0x02 /* NMI interrupt */
  566. CALL _strayintr(SB); BYTE $0x03 /* breakpoint */
  567. CALL _strayintr(SB); BYTE $0x04 /* overflow */
  568. CALL _strayintr(SB); BYTE $0x05 /* bound */
  569. CALL _strayintr(SB); BYTE $0x06 /* invalid opcode */
  570. CALL _strayintr(SB); BYTE $0x07 /* no coprocessor available */
  571. CALL _strayintrx(SB); BYTE $0x08 /* double fault */
  572. CALL _strayintr(SB); BYTE $0x09 /* coprocessor segment overflow */
  573. CALL _strayintrx(SB); BYTE $0x0A /* invalid TSS */
  574. CALL _strayintrx(SB); BYTE $0x0B /* segment not available */
  575. CALL _strayintrx(SB); BYTE $0x0C /* stack exception */
  576. CALL _strayintrx(SB); BYTE $0x0D /* general protection error */
  577. CALL _strayintrx(SB); BYTE $0x0E /* page fault */
  578. CALL _strayintr(SB); BYTE $0x0F /* */
  579. CALL _strayintr(SB); BYTE $0x10 /* coprocessor error */
  580. CALL _strayintrx(SB); BYTE $0x11 /* alignment check */
  581. CALL _strayintr(SB); BYTE $0x12 /* machine check */
  582. CALL _strayintr(SB); BYTE $0x13
  583. CALL _strayintr(SB); BYTE $0x14
  584. CALL _strayintr(SB); BYTE $0x15
  585. CALL _strayintr(SB); BYTE $0x16
  586. CALL _strayintr(SB); BYTE $0x17
  587. CALL _strayintr(SB); BYTE $0x18
  588. CALL _strayintr(SB); BYTE $0x19
  589. CALL _strayintr(SB); BYTE $0x1A
  590. CALL _strayintr(SB); BYTE $0x1B
  591. CALL _strayintr(SB); BYTE $0x1C
  592. CALL _strayintr(SB); BYTE $0x1D
  593. CALL _strayintr(SB); BYTE $0x1E
  594. CALL _strayintr(SB); BYTE $0x1F
  595. CALL _strayintr(SB); BYTE $0x20 /* VectorLAPIC */
  596. CALL _strayintr(SB); BYTE $0x21
  597. CALL _strayintr(SB); BYTE $0x22
  598. CALL _strayintr(SB); BYTE $0x23
  599. CALL _strayintr(SB); BYTE $0x24
  600. CALL _strayintr(SB); BYTE $0x25
  601. CALL _strayintr(SB); BYTE $0x26
  602. CALL _strayintr(SB); BYTE $0x27
  603. CALL _strayintr(SB); BYTE $0x28
  604. CALL _strayintr(SB); BYTE $0x29
  605. CALL _strayintr(SB); BYTE $0x2A
  606. CALL _strayintr(SB); BYTE $0x2B
  607. CALL _strayintr(SB); BYTE $0x2C
  608. CALL _strayintr(SB); BYTE $0x2D
  609. CALL _strayintr(SB); BYTE $0x2E
  610. CALL _strayintr(SB); BYTE $0x2F
  611. CALL _strayintr(SB); BYTE $0x30
  612. CALL _strayintr(SB); BYTE $0x31
  613. CALL _strayintr(SB); BYTE $0x32
  614. CALL _strayintr(SB); BYTE $0x33
  615. CALL _strayintr(SB); BYTE $0x34
  616. CALL _strayintr(SB); BYTE $0x35
  617. CALL _strayintr(SB); BYTE $0x36
  618. CALL _strayintr(SB); BYTE $0x37
  619. CALL _strayintr(SB); BYTE $0x38
  620. CALL _strayintr(SB); BYTE $0x39
  621. CALL _strayintr(SB); BYTE $0x3A
  622. CALL _strayintr(SB); BYTE $0x3B
  623. CALL _strayintr(SB); BYTE $0x3C
  624. CALL _strayintr(SB); BYTE $0x3D
  625. CALL _strayintr(SB); BYTE $0x3E
  626. CALL _strayintr(SB); BYTE $0x3F
  627. CALL _syscallintr(SB); BYTE $0x40 /* VectorSYSCALL */
  628. CALL _strayintr(SB); BYTE $0x41
  629. CALL _strayintr(SB); BYTE $0x42
  630. CALL _strayintr(SB); BYTE $0x43
  631. CALL _strayintr(SB); BYTE $0x44
  632. CALL _strayintr(SB); BYTE $0x45
  633. CALL _strayintr(SB); BYTE $0x46
  634. CALL _strayintr(SB); BYTE $0x47
  635. CALL _strayintr(SB); BYTE $0x48
  636. CALL _strayintr(SB); BYTE $0x49
  637. CALL _strayintr(SB); BYTE $0x4A
  638. CALL _strayintr(SB); BYTE $0x4B
  639. CALL _strayintr(SB); BYTE $0x4C
  640. CALL _strayintr(SB); BYTE $0x4D
  641. CALL _strayintr(SB); BYTE $0x4E
  642. CALL _strayintr(SB); BYTE $0x4F
  643. CALL _strayintr(SB); BYTE $0x50
  644. CALL _strayintr(SB); BYTE $0x51
  645. CALL _strayintr(SB); BYTE $0x52
  646. CALL _strayintr(SB); BYTE $0x53
  647. CALL _strayintr(SB); BYTE $0x54
  648. CALL _strayintr(SB); BYTE $0x55
  649. CALL _strayintr(SB); BYTE $0x56
  650. CALL _strayintr(SB); BYTE $0x57
  651. CALL _strayintr(SB); BYTE $0x58
  652. CALL _strayintr(SB); BYTE $0x59
  653. CALL _strayintr(SB); BYTE $0x5A
  654. CALL _strayintr(SB); BYTE $0x5B
  655. CALL _strayintr(SB); BYTE $0x5C
  656. CALL _strayintr(SB); BYTE $0x5D
  657. CALL _strayintr(SB); BYTE $0x5E
  658. CALL _strayintr(SB); BYTE $0x5F
  659. CALL _strayintr(SB); BYTE $0x60
  660. CALL _strayintr(SB); BYTE $0x61
  661. CALL _strayintr(SB); BYTE $0x62
  662. CALL _strayintr(SB); BYTE $0x63
  663. CALL _strayintr(SB); BYTE $0x64
  664. CALL _strayintr(SB); BYTE $0x65
  665. CALL _strayintr(SB); BYTE $0x66
  666. CALL _strayintr(SB); BYTE $0x67
  667. CALL _strayintr(SB); BYTE $0x68
  668. CALL _strayintr(SB); BYTE $0x69
  669. CALL _strayintr(SB); BYTE $0x6A
  670. CALL _strayintr(SB); BYTE $0x6B
  671. CALL _strayintr(SB); BYTE $0x6C
  672. CALL _strayintr(SB); BYTE $0x6D
  673. CALL _strayintr(SB); BYTE $0x6E
  674. CALL _strayintr(SB); BYTE $0x6F
  675. CALL _strayintr(SB); BYTE $0x70
  676. CALL _strayintr(SB); BYTE $0x71
  677. CALL _strayintr(SB); BYTE $0x72
  678. CALL _strayintr(SB); BYTE $0x73
  679. CALL _strayintr(SB); BYTE $0x74
  680. CALL _strayintr(SB); BYTE $0x75
  681. CALL _strayintr(SB); BYTE $0x76
  682. CALL _strayintr(SB); BYTE $0x77
  683. CALL _strayintr(SB); BYTE $0x78
  684. CALL _strayintr(SB); BYTE $0x79
  685. CALL _strayintr(SB); BYTE $0x7A
  686. CALL _strayintr(SB); BYTE $0x7B
  687. CALL _strayintr(SB); BYTE $0x7C
  688. CALL _strayintr(SB); BYTE $0x7D
  689. CALL _strayintr(SB); BYTE $0x7E
  690. CALL _strayintr(SB); BYTE $0x7F
  691. CALL _strayintr(SB); BYTE $0x80 /* Vector[A]PIC */
  692. CALL _strayintr(SB); BYTE $0x81
  693. CALL _strayintr(SB); BYTE $0x82
  694. CALL _strayintr(SB); BYTE $0x83
  695. CALL _strayintr(SB); BYTE $0x84
  696. CALL _strayintr(SB); BYTE $0x85
  697. CALL _strayintr(SB); BYTE $0x86
  698. CALL _strayintr(SB); BYTE $0x87
  699. CALL _strayintr(SB); BYTE $0x88
  700. CALL _strayintr(SB); BYTE $0x89
  701. CALL _strayintr(SB); BYTE $0x8A
  702. CALL _strayintr(SB); BYTE $0x8B
  703. CALL _strayintr(SB); BYTE $0x8C
  704. CALL _strayintr(SB); BYTE $0x8D
  705. CALL _strayintr(SB); BYTE $0x8E
  706. CALL _strayintr(SB); BYTE $0x8F
  707. CALL _strayintr(SB); BYTE $0x90
  708. CALL _strayintr(SB); BYTE $0x91
  709. CALL _strayintr(SB); BYTE $0x92
  710. CALL _strayintr(SB); BYTE $0x93
  711. CALL _strayintr(SB); BYTE $0x94
  712. CALL _strayintr(SB); BYTE $0x95
  713. CALL _strayintr(SB); BYTE $0x96
  714. CALL _strayintr(SB); BYTE $0x97
  715. CALL _strayintr(SB); BYTE $0x98
  716. CALL _strayintr(SB); BYTE $0x99
  717. CALL _strayintr(SB); BYTE $0x9A
  718. CALL _strayintr(SB); BYTE $0x9B
  719. CALL _strayintr(SB); BYTE $0x9C
  720. CALL _strayintr(SB); BYTE $0x9D
  721. CALL _strayintr(SB); BYTE $0x9E
  722. CALL _strayintr(SB); BYTE $0x9F
  723. CALL _strayintr(SB); BYTE $0xA0
  724. CALL _strayintr(SB); BYTE $0xA1
  725. CALL _strayintr(SB); BYTE $0xA2
  726. CALL _strayintr(SB); BYTE $0xA3
  727. CALL _strayintr(SB); BYTE $0xA4
  728. CALL _strayintr(SB); BYTE $0xA5
  729. CALL _strayintr(SB); BYTE $0xA6
  730. CALL _strayintr(SB); BYTE $0xA7
  731. CALL _strayintr(SB); BYTE $0xA8
  732. CALL _strayintr(SB); BYTE $0xA9
  733. CALL _strayintr(SB); BYTE $0xAA
  734. CALL _strayintr(SB); BYTE $0xAB
  735. CALL _strayintr(SB); BYTE $0xAC
  736. CALL _strayintr(SB); BYTE $0xAD
  737. CALL _strayintr(SB); BYTE $0xAE
  738. CALL _strayintr(SB); BYTE $0xAF
  739. CALL _strayintr(SB); BYTE $0xB0
  740. CALL _strayintr(SB); BYTE $0xB1
  741. CALL _strayintr(SB); BYTE $0xB2
  742. CALL _strayintr(SB); BYTE $0xB3
  743. CALL _strayintr(SB); BYTE $0xB4
  744. CALL _strayintr(SB); BYTE $0xB5
  745. CALL _strayintr(SB); BYTE $0xB6
  746. CALL _strayintr(SB); BYTE $0xB7
  747. CALL _strayintr(SB); BYTE $0xB8
  748. CALL _strayintr(SB); BYTE $0xB9
  749. CALL _strayintr(SB); BYTE $0xBA
  750. CALL _strayintr(SB); BYTE $0xBB
  751. CALL _strayintr(SB); BYTE $0xBC
  752. CALL _strayintr(SB); BYTE $0xBD
  753. CALL _strayintr(SB); BYTE $0xBE
  754. CALL _strayintr(SB); BYTE $0xBF
  755. CALL _strayintr(SB); BYTE $0xC0
  756. CALL _strayintr(SB); BYTE $0xC1
  757. CALL _strayintr(SB); BYTE $0xC2
  758. CALL _strayintr(SB); BYTE $0xC3
  759. CALL _strayintr(SB); BYTE $0xC4
  760. CALL _strayintr(SB); BYTE $0xC5
  761. CALL _strayintr(SB); BYTE $0xC6
  762. CALL _strayintr(SB); BYTE $0xC7
  763. CALL _strayintr(SB); BYTE $0xC8
  764. CALL _strayintr(SB); BYTE $0xC9
  765. CALL _strayintr(SB); BYTE $0xCA
  766. CALL _strayintr(SB); BYTE $0xCB
  767. CALL _strayintr(SB); BYTE $0xCC
  768. CALL _strayintr(SB); BYTE $0xCD
  769. CALL _strayintr(SB); BYTE $0xCE
  770. CALL _strayintr(SB); BYTE $0xCF
  771. CALL _strayintr(SB); BYTE $0xD0
  772. CALL _strayintr(SB); BYTE $0xD1
  773. CALL _strayintr(SB); BYTE $0xD2
  774. CALL _strayintr(SB); BYTE $0xD3
  775. CALL _strayintr(SB); BYTE $0xD4
  776. CALL _strayintr(SB); BYTE $0xD5
  777. CALL _strayintr(SB); BYTE $0xD6
  778. CALL _strayintr(SB); BYTE $0xD7
  779. CALL _strayintr(SB); BYTE $0xD8
  780. CALL _strayintr(SB); BYTE $0xD9
  781. CALL _strayintr(SB); BYTE $0xDA
  782. CALL _strayintr(SB); BYTE $0xDB
  783. CALL _strayintr(SB); BYTE $0xDC
  784. CALL _strayintr(SB); BYTE $0xDD
  785. CALL _strayintr(SB); BYTE $0xDE
  786. CALL _strayintr(SB); BYTE $0xDF
  787. CALL _strayintr(SB); BYTE $0xE0
  788. CALL _strayintr(SB); BYTE $0xE1
  789. CALL _strayintr(SB); BYTE $0xE2
  790. CALL _strayintr(SB); BYTE $0xE3
  791. CALL _strayintr(SB); BYTE $0xE4
  792. CALL _strayintr(SB); BYTE $0xE5
  793. CALL _strayintr(SB); BYTE $0xE6
  794. CALL _strayintr(SB); BYTE $0xE7
  795. CALL _strayintr(SB); BYTE $0xE8
  796. CALL _strayintr(SB); BYTE $0xE9
  797. CALL _strayintr(SB); BYTE $0xEA
  798. CALL _strayintr(SB); BYTE $0xEB
  799. CALL _strayintr(SB); BYTE $0xEC
  800. CALL _strayintr(SB); BYTE $0xED
  801. CALL _strayintr(SB); BYTE $0xEE
  802. CALL _strayintr(SB); BYTE $0xEF
  803. CALL _strayintr(SB); BYTE $0xF0
  804. CALL _strayintr(SB); BYTE $0xF1
  805. CALL _strayintr(SB); BYTE $0xF2
  806. CALL _strayintr(SB); BYTE $0xF3
  807. CALL _strayintr(SB); BYTE $0xF4
  808. CALL _strayintr(SB); BYTE $0xF5
  809. CALL _strayintr(SB); BYTE $0xF6
  810. CALL _strayintr(SB); BYTE $0xF7
  811. CALL _strayintr(SB); BYTE $0xF8
  812. CALL _strayintr(SB); BYTE $0xF9
  813. CALL _strayintr(SB); BYTE $0xFA
  814. CALL _strayintr(SB); BYTE $0xFB
  815. CALL _strayintr(SB); BYTE $0xFC
  816. CALL _strayintr(SB); BYTE $0xFD
  817. CALL _strayintr(SB); BYTE $0xFE
  818. CALL _strayintr(SB); BYTE $0xFF