@aptre/v86 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +22 -0
  2. package/LICENSE.MIT +22 -0
  3. package/Readme.md +237 -0
  4. package/dist/v86.browser.js +26666 -0
  5. package/dist/v86.browser.js.map +7 -0
  6. package/dist/v86.js +26632 -0
  7. package/dist/v86.js.map +7 -0
  8. package/gen/generate_analyzer.ts +512 -0
  9. package/gen/generate_interpreter.ts +522 -0
  10. package/gen/generate_jit.ts +624 -0
  11. package/gen/rust_ast.ts +107 -0
  12. package/gen/util.ts +35 -0
  13. package/gen/x86_table.ts +1836 -0
  14. package/lib/9p.ts +1547 -0
  15. package/lib/filesystem.ts +1879 -0
  16. package/lib/marshall.ts +168 -0
  17. package/lib/softfloat/softfloat.c +32501 -0
  18. package/lib/zstd/zstddeclib.c +13520 -0
  19. package/package.json +75 -0
  20. package/src/acpi.ts +267 -0
  21. package/src/browser/dummy_screen.ts +106 -0
  22. package/src/browser/fake_network.ts +1771 -0
  23. package/src/browser/fetch_network.ts +361 -0
  24. package/src/browser/filestorage.ts +124 -0
  25. package/src/browser/inbrowser_network.ts +57 -0
  26. package/src/browser/keyboard.ts +564 -0
  27. package/src/browser/main.ts +3415 -0
  28. package/src/browser/mouse.ts +255 -0
  29. package/src/browser/network.ts +142 -0
  30. package/src/browser/print_stats.ts +336 -0
  31. package/src/browser/screen.ts +978 -0
  32. package/src/browser/serial.ts +316 -0
  33. package/src/browser/speaker.ts +1223 -0
  34. package/src/browser/starter.ts +1688 -0
  35. package/src/browser/wisp_network.ts +332 -0
  36. package/src/browser/worker_bus.ts +64 -0
  37. package/src/buffer.ts +652 -0
  38. package/src/bus.ts +78 -0
  39. package/src/const.ts +128 -0
  40. package/src/cpu.ts +2891 -0
  41. package/src/dma.ts +474 -0
  42. package/src/elf.ts +251 -0
  43. package/src/floppy.ts +1778 -0
  44. package/src/ide.ts +3455 -0
  45. package/src/io.ts +504 -0
  46. package/src/iso9660.ts +317 -0
  47. package/src/kernel.ts +250 -0
  48. package/src/lib.ts +645 -0
  49. package/src/log.ts +149 -0
  50. package/src/main.ts +199 -0
  51. package/src/ne2k.ts +1589 -0
  52. package/src/pci.ts +815 -0
  53. package/src/pit.ts +406 -0
  54. package/src/ps2.ts +820 -0
  55. package/src/rtc.ts +537 -0
  56. package/src/rust/analysis.rs +101 -0
  57. package/src/rust/codegen.rs +2660 -0
  58. package/src/rust/config.rs +3 -0
  59. package/src/rust/control_flow.rs +425 -0
  60. package/src/rust/cpu/apic.rs +658 -0
  61. package/src/rust/cpu/arith.rs +1207 -0
  62. package/src/rust/cpu/call_indirect.rs +2 -0
  63. package/src/rust/cpu/cpu.rs +4501 -0
  64. package/src/rust/cpu/fpu.rs +923 -0
  65. package/src/rust/cpu/global_pointers.rs +112 -0
  66. package/src/rust/cpu/instructions.rs +2486 -0
  67. package/src/rust/cpu/instructions_0f.rs +5261 -0
  68. package/src/rust/cpu/ioapic.rs +316 -0
  69. package/src/rust/cpu/memory.rs +351 -0
  70. package/src/rust/cpu/misc_instr.rs +613 -0
  71. package/src/rust/cpu/mod.rs +16 -0
  72. package/src/rust/cpu/modrm.rs +133 -0
  73. package/src/rust/cpu/pic.rs +402 -0
  74. package/src/rust/cpu/sse_instr.rs +361 -0
  75. package/src/rust/cpu/string.rs +701 -0
  76. package/src/rust/cpu/vga.rs +175 -0
  77. package/src/rust/cpu_context.rs +69 -0
  78. package/src/rust/dbg.rs +98 -0
  79. package/src/rust/gen/analyzer.rs +3807 -0
  80. package/src/rust/gen/analyzer0f.rs +3992 -0
  81. package/src/rust/gen/interpreter.rs +4447 -0
  82. package/src/rust/gen/interpreter0f.rs +5404 -0
  83. package/src/rust/gen/jit.rs +5080 -0
  84. package/src/rust/gen/jit0f.rs +5547 -0
  85. package/src/rust/gen/mod.rs +14 -0
  86. package/src/rust/jit.rs +2443 -0
  87. package/src/rust/jit_instructions.rs +7881 -0
  88. package/src/rust/js_api.rs +6 -0
  89. package/src/rust/leb.rs +46 -0
  90. package/src/rust/lib.rs +29 -0
  91. package/src/rust/modrm.rs +330 -0
  92. package/src/rust/opstats.rs +249 -0
  93. package/src/rust/page.rs +15 -0
  94. package/src/rust/paging.rs +25 -0
  95. package/src/rust/prefix.rs +15 -0
  96. package/src/rust/profiler.rs +155 -0
  97. package/src/rust/regs.rs +38 -0
  98. package/src/rust/softfloat.rs +286 -0
  99. package/src/rust/state_flags.rs +27 -0
  100. package/src/rust/wasmgen/mod.rs +2 -0
  101. package/src/rust/wasmgen/wasm_builder.rs +1047 -0
  102. package/src/rust/wasmgen/wasm_opcodes.rs +221 -0
  103. package/src/rust/zstd.rs +105 -0
  104. package/src/sb16.ts +1928 -0
  105. package/src/state.ts +359 -0
  106. package/src/uart.ts +472 -0
  107. package/src/vga.ts +2791 -0
  108. package/src/virtio.ts +1756 -0
  109. package/src/virtio_balloon.ts +273 -0
  110. package/src/virtio_console.ts +372 -0
  111. package/src/virtio_net.ts +326 -0
package/src/io.ts ADDED
@@ -0,0 +1,504 @@
1
+ declare let DEBUG: boolean
2
+
3
+ import { LOG_IO, MMAP_BLOCK_BITS, MMAP_BLOCK_SIZE, MMAP_MAX } from './const.js'
4
+ import { h } from './lib.js'
5
+ import { dbg_assert, dbg_log } from './log.js'
6
+
7
+ // Enables logging all IO port reads and writes. Very verbose
8
+ const LOG_ALL_IO = false
9
+
10
+ type PortReadFn = (port: number) => number
11
+ type PortWriteFn = (port: number) => void
12
+
13
+ interface IOPortEntry {
14
+ read8: PortReadFn
15
+ read16: PortReadFn
16
+ read32: PortReadFn
17
+ write8: PortWriteFn
18
+ write16: PortWriteFn
19
+ write32: PortWriteFn
20
+ device: IODevice | undefined
21
+ }
22
+
23
+ type MmapReadFn = (addr: number) => number
24
+ type MmapWriteFn = (addr: number, value: number) => void
25
+
26
+ // Minimal interface for the CPU fields IO needs
27
+ interface IOCpu {
28
+ memory_size: Int32Array
29
+ memory_map_read8: (MmapReadFn | undefined)[]
30
+ memory_map_write8: (MmapWriteFn | undefined)[]
31
+ memory_map_read32: (MmapReadFn | undefined)[]
32
+ memory_map_write32: (MmapWriteFn | undefined)[]
33
+ }
34
+
35
+ interface IODevice {
36
+ name?: string
37
+ }
38
+
39
+ export class IO {
40
+ ports: IOPortEntry[]
41
+ cpu: IOCpu
42
+
43
+ constructor(cpu: IOCpu) {
44
+ this.ports = []
45
+ this.cpu = cpu
46
+
47
+ for (let i = 0; i < 0x10000; i++) {
48
+ this.ports[i] = this.create_empty_entry()
49
+ }
50
+
51
+ const memory_size = cpu.memory_size[0]
52
+
53
+ for (let i = 0; i << MMAP_BLOCK_BITS < memory_size; i++) {
54
+ // avoid sparse arrays
55
+ cpu.memory_map_read8[i] = cpu.memory_map_write8[i] = undefined
56
+ cpu.memory_map_read32[i] = cpu.memory_map_write32[i] = undefined
57
+ }
58
+
59
+ this.mmap_register(
60
+ memory_size,
61
+ MMAP_MAX - memory_size,
62
+ function (addr) {
63
+ // read outside of the memory size
64
+ dbg_log(
65
+ 'Read from unmapped memory space, addr=' + h(addr >>> 0, 8),
66
+ LOG_IO,
67
+ )
68
+ return 0xff
69
+ },
70
+ function (addr, value) {
71
+ // write outside of the memory size
72
+ dbg_log(
73
+ 'Write to unmapped memory space, addr=' +
74
+ h(addr >>> 0, 8) +
75
+ ' value=' +
76
+ h(value, 2),
77
+ LOG_IO,
78
+ )
79
+ },
80
+ function (addr) {
81
+ dbg_log(
82
+ 'Read from unmapped memory space, addr=' + h(addr >>> 0, 8),
83
+ LOG_IO,
84
+ )
85
+ return -1
86
+ },
87
+ function (addr, value) {
88
+ dbg_log(
89
+ 'Write to unmapped memory space, addr=' +
90
+ h(addr >>> 0, 8) +
91
+ ' value=' +
92
+ h(value >>> 0, 8),
93
+ LOG_IO,
94
+ )
95
+ },
96
+ )
97
+ }
98
+
99
+ create_empty_entry(): IOPortEntry {
100
+ return {
101
+ read8: this.empty_port_read8,
102
+ read16: this.empty_port_read16,
103
+ read32: this.empty_port_read32,
104
+
105
+ write8: this.empty_port_write,
106
+ write16: this.empty_port_write,
107
+ write32: this.empty_port_write,
108
+
109
+ device: undefined,
110
+ }
111
+ }
112
+
113
+ empty_port_read8(): number {
114
+ return 0xff
115
+ }
116
+
117
+ empty_port_read16(): number {
118
+ return 0xffff
119
+ }
120
+
121
+ empty_port_read32(): number {
122
+ return -1
123
+ }
124
+
125
+ empty_port_write(_x: number): void {}
126
+
127
+ register_read(
128
+ port_addr: number,
129
+ device: IODevice,
130
+ r8?: PortReadFn,
131
+ r16?: PortReadFn,
132
+ r32?: PortReadFn,
133
+ ): void {
134
+ dbg_assert(typeof port_addr === 'number')
135
+ dbg_assert(typeof device === 'object')
136
+ dbg_assert(!r8 || typeof r8 === 'function')
137
+ dbg_assert(!r16 || typeof r16 === 'function')
138
+ dbg_assert(!r32 || typeof r32 === 'function')
139
+ dbg_assert(!!(r8 || r16 || r32))
140
+
141
+ if (DEBUG) {
142
+ const fail = function (n: number): number {
143
+ dbg_assert(
144
+ false,
145
+ 'Overlapped read' +
146
+ n +
147
+ ' ' +
148
+ h(port_addr, 4) +
149
+ ' (' +
150
+ device.name +
151
+ ')',
152
+ )
153
+ return (-1 >>> (32 - n)) | 0
154
+ }
155
+ if (!r8) r8 = fail.bind(this, 8)
156
+ if (!r16) r16 = fail.bind(this, 16)
157
+ if (!r32) r32 = fail.bind(this, 32)
158
+ }
159
+
160
+ if (r8) this.ports[port_addr].read8 = r8
161
+ if (r16) this.ports[port_addr].read16 = r16
162
+ if (r32) this.ports[port_addr].read32 = r32
163
+ this.ports[port_addr].device = device
164
+ }
165
+
166
+ register_write(
167
+ port_addr: number,
168
+ device: IODevice,
169
+ w8?: PortWriteFn,
170
+ w16?: PortWriteFn,
171
+ w32?: PortWriteFn,
172
+ ): void {
173
+ dbg_assert(typeof port_addr === 'number')
174
+ dbg_assert(typeof device === 'object')
175
+ dbg_assert(!w8 || typeof w8 === 'function')
176
+ dbg_assert(!w16 || typeof w16 === 'function')
177
+ dbg_assert(!w32 || typeof w32 === 'function')
178
+ dbg_assert(!!(w8 || w16 || w32))
179
+
180
+ if (DEBUG) {
181
+ const fail = function (n: number): void {
182
+ dbg_assert(
183
+ false,
184
+ 'Overlapped write' +
185
+ n +
186
+ ' ' +
187
+ h(port_addr) +
188
+ ' (' +
189
+ device.name +
190
+ ')',
191
+ )
192
+ }
193
+ if (!w8) w8 = fail.bind(this, 8)
194
+ if (!w16) w16 = fail.bind(this, 16)
195
+ if (!w32) w32 = fail.bind(this, 32)
196
+ }
197
+
198
+ if (w8) this.ports[port_addr].write8 = w8
199
+ if (w16) this.ports[port_addr].write16 = w16
200
+ if (w32) this.ports[port_addr].write32 = w32
201
+ this.ports[port_addr].device = device
202
+ }
203
+
204
+ // > Any two consecutive 8-bit ports can be treated as a 16-bit port;
205
+ // > and four consecutive 8-bit ports can be treated as a 32-bit port
206
+ // > http://css.csail.mit.edu/6.858/2012/readings/i386/s08_01.htm
207
+ //
208
+ // This info is not correct for all ports, but handled by the following functions
209
+ //
210
+ // Register the read of 2 or 4 consecutive 8-bit ports, 1 or 2 16-bit
211
+ // ports and 0 or 1 32-bit ports
212
+ register_read_consecutive(
213
+ port_addr: number,
214
+ device: IODevice,
215
+ r8_1: PortReadFn,
216
+ r8_2: PortReadFn,
217
+ r8_3?: PortReadFn,
218
+ r8_4?: PortReadFn,
219
+ ): void {
220
+ function r16_1(this: IODevice): number {
221
+ return r8_1.call(this, 0) | (r8_2.call(this, 0) << 8)
222
+ }
223
+ function r16_2(this: IODevice): number {
224
+ return r8_3!.call(this, 0) | (r8_4!.call(this, 0) << 8)
225
+ }
226
+ function r32(this: IODevice): number {
227
+ return (
228
+ r8_1.call(this, 0) |
229
+ (r8_2.call(this, 0) << 8) |
230
+ (r8_3!.call(this, 0) << 16) |
231
+ (r8_4!.call(this, 0) << 24)
232
+ )
233
+ }
234
+
235
+ if (r8_3 && r8_4) {
236
+ this.register_read(port_addr, device, r8_1, r16_1, r32)
237
+ this.register_read(port_addr + 1, device, r8_2)
238
+ this.register_read(port_addr + 2, device, r8_3, r16_2)
239
+ this.register_read(port_addr + 3, device, r8_4)
240
+ } else {
241
+ this.register_read(port_addr, device, r8_1, r16_1)
242
+ this.register_read(port_addr + 1, device, r8_2)
243
+ }
244
+ }
245
+
246
+ register_write_consecutive(
247
+ port_addr: number,
248
+ device: IODevice,
249
+ w8_1: PortWriteFn,
250
+ w8_2: PortWriteFn,
251
+ w8_3?: PortWriteFn,
252
+ w8_4?: PortWriteFn,
253
+ ): void {
254
+ function w16_1(this: IODevice, data: number): void {
255
+ w8_1.call(this, data & 0xff)
256
+ w8_2.call(this, (data >> 8) & 0xff)
257
+ }
258
+ function w16_2(this: IODevice, data: number): void {
259
+ w8_3!.call(this, data & 0xff)
260
+ w8_4!.call(this, (data >> 8) & 0xff)
261
+ }
262
+ function w32(this: IODevice, data: number): void {
263
+ w8_1.call(this, data & 0xff)
264
+ w8_2.call(this, (data >> 8) & 0xff)
265
+ w8_3!.call(this, (data >> 16) & 0xff)
266
+ w8_4!.call(this, data >>> 24)
267
+ }
268
+
269
+ if (w8_3 && w8_4) {
270
+ this.register_write(port_addr, device, w8_1, w16_1, w32)
271
+ this.register_write(port_addr + 1, device, w8_2)
272
+ this.register_write(port_addr + 2, device, w8_3, w16_2)
273
+ this.register_write(port_addr + 3, device, w8_4)
274
+ } else {
275
+ this.register_write(port_addr, device, w8_1, w16_1)
276
+ this.register_write(port_addr + 1, device, w8_2)
277
+ }
278
+ }
279
+
280
+ mmap_read32_shim(addr: number): number {
281
+ const aligned_addr = addr >>> MMAP_BLOCK_BITS
282
+ const fn = this.cpu.memory_map_read8[aligned_addr]!
283
+
284
+ return (
285
+ fn(addr) |
286
+ (fn(addr + 1) << 8) |
287
+ (fn(addr + 2) << 16) |
288
+ (fn(addr + 3) << 24)
289
+ )
290
+ }
291
+
292
+ mmap_write32_shim(addr: number, value: number): void {
293
+ const aligned_addr = addr >>> MMAP_BLOCK_BITS
294
+ const fn = this.cpu.memory_map_write8[aligned_addr]!
295
+
296
+ fn(addr, value & 0xff)
297
+ fn(addr + 1, (value >> 8) & 0xff)
298
+ fn(addr + 2, (value >> 16) & 0xff)
299
+ fn(addr + 3, value >>> 24)
300
+ }
301
+
302
+ mmap_register(
303
+ addr: number,
304
+ size: number,
305
+ read_func8: MmapReadFn,
306
+ write_func8: MmapWriteFn,
307
+ read_func32?: MmapReadFn,
308
+ write_func32?: MmapWriteFn,
309
+ ): void {
310
+ dbg_log(
311
+ 'mmap_register addr=' + h(addr >>> 0, 8) + ' size=' + h(size, 8),
312
+ LOG_IO,
313
+ )
314
+
315
+ dbg_assert((addr & (MMAP_BLOCK_SIZE - 1)) === 0)
316
+ dbg_assert(size > 0 && (size & (MMAP_BLOCK_SIZE - 1)) === 0)
317
+
318
+ if (!read_func32) read_func32 = this.mmap_read32_shim.bind(this)
319
+
320
+ if (!write_func32) write_func32 = this.mmap_write32_shim.bind(this)
321
+
322
+ let aligned_addr = addr >>> MMAP_BLOCK_BITS
323
+
324
+ for (; size > 0; aligned_addr++) {
325
+ this.cpu.memory_map_read8[aligned_addr] = read_func8
326
+ this.cpu.memory_map_write8[aligned_addr] = write_func8
327
+ this.cpu.memory_map_read32[aligned_addr] = read_func32
328
+ this.cpu.memory_map_write32[aligned_addr] = write_func32
329
+
330
+ size -= MMAP_BLOCK_SIZE
331
+ }
332
+ }
333
+
334
+ port_write8(port_addr: number, data: number): void {
335
+ const entry = this.ports[port_addr]
336
+
337
+ if (entry.write8 === this.empty_port_write || LOG_ALL_IO) {
338
+ dbg_log(
339
+ 'write8 port #' +
340
+ h(port_addr, 4) +
341
+ ' <- ' +
342
+ h(data, 2) +
343
+ this.get_port_description(port_addr),
344
+ LOG_IO,
345
+ )
346
+ }
347
+ entry.write8.call(entry.device, data)
348
+ }
349
+
350
+ port_write16(port_addr: number, data: number): void {
351
+ const entry = this.ports[port_addr]
352
+
353
+ if (entry.write16 === this.empty_port_write || LOG_ALL_IO) {
354
+ dbg_log(
355
+ 'write16 port #' +
356
+ h(port_addr, 4) +
357
+ ' <- ' +
358
+ h(data, 4) +
359
+ this.get_port_description(port_addr),
360
+ LOG_IO,
361
+ )
362
+ }
363
+ entry.write16.call(entry.device, data)
364
+ }
365
+
366
+ port_write32(port_addr: number, data: number): void {
367
+ const entry = this.ports[port_addr]
368
+
369
+ if (entry.write32 === this.empty_port_write || LOG_ALL_IO) {
370
+ dbg_log(
371
+ 'write32 port #' +
372
+ h(port_addr, 4) +
373
+ ' <- ' +
374
+ h(data >>> 0, 8) +
375
+ this.get_port_description(port_addr),
376
+ LOG_IO,
377
+ )
378
+ }
379
+ entry.write32.call(entry.device, data)
380
+ }
381
+
382
+ port_read8(port_addr: number): number {
383
+ const entry = this.ports[port_addr]
384
+
385
+ if (entry.read8 === this.empty_port_read8 || LOG_ALL_IO) {
386
+ dbg_log(
387
+ 'read8 port #' +
388
+ h(port_addr, 4) +
389
+ this.get_port_description(port_addr),
390
+ LOG_IO,
391
+ )
392
+ }
393
+ const value = entry.read8.call(entry.device, port_addr)
394
+ dbg_assert(typeof value === 'number')
395
+ if (value < 0 || value >= 0x100)
396
+ dbg_assert(
397
+ false,
398
+ '8 bit port returned large value: ' + h(port_addr),
399
+ )
400
+ return value
401
+ }
402
+
403
+ port_read16(port_addr: number): number {
404
+ const entry = this.ports[port_addr]
405
+
406
+ if (entry.read16 === this.empty_port_read16 || LOG_ALL_IO) {
407
+ dbg_log(
408
+ 'read16 port #' +
409
+ h(port_addr, 4) +
410
+ this.get_port_description(port_addr),
411
+ LOG_IO,
412
+ )
413
+ }
414
+ const value = entry.read16.call(entry.device, port_addr)
415
+ dbg_assert(typeof value === 'number')
416
+ if (value < 0 || value >= 0x10000)
417
+ dbg_assert(
418
+ false,
419
+ '16 bit port returned large value: ' + h(port_addr),
420
+ )
421
+ return value
422
+ }
423
+
424
+ port_read32(port_addr: number): number {
425
+ const entry = this.ports[port_addr]
426
+
427
+ if (entry.read32 === this.empty_port_read32 || LOG_ALL_IO) {
428
+ dbg_log(
429
+ 'read32 port #' +
430
+ h(port_addr, 4) +
431
+ this.get_port_description(port_addr),
432
+ LOG_IO,
433
+ )
434
+ }
435
+ const value = entry.read32.call(entry.device, port_addr)
436
+ dbg_assert((value | 0) === value)
437
+ return value
438
+ }
439
+
440
+ get_port_description(addr: number): string {
441
+ if (debug_port_list[addr]) {
442
+ return ' (' + debug_port_list[addr] + ')'
443
+ } else {
444
+ return ''
445
+ }
446
+ }
447
+ }
448
+
449
+ // via seabios ioport.h
450
+ const debug_port_list: Record<number, string> = {
451
+ 0x0004: 'PORT_DMA_ADDR_2',
452
+ 0x0005: 'PORT_DMA_CNT_2',
453
+ 0x000a: 'PORT_DMA1_MASK_REG',
454
+ 0x000b: 'PORT_DMA1_MODE_REG',
455
+ 0x000c: 'PORT_DMA1_CLEAR_FF_REG',
456
+ 0x000d: 'PORT_DMA1_MASTER_CLEAR',
457
+ 0x0020: 'PORT_PIC1_CMD',
458
+ 0x0021: 'PORT_PIC1_DATA',
459
+ 0x0040: 'PORT_PIT_COUNTER0',
460
+ 0x0041: 'PORT_PIT_COUNTER1',
461
+ 0x0042: 'PORT_PIT_COUNTER2',
462
+ 0x0043: 'PORT_PIT_MODE',
463
+ 0x0060: 'PORT_PS2_DATA',
464
+ 0x0061: 'PORT_PS2_CTRLB',
465
+ 0x0064: 'PORT_PS2_STATUS',
466
+ 0x0070: 'PORT_CMOS_INDEX',
467
+ 0x0071: 'PORT_CMOS_DATA',
468
+ 0x0080: 'PORT_DIAG',
469
+ 0x0081: 'PORT_DMA_PAGE_2',
470
+ 0x0092: 'PORT_A20',
471
+ 0x00a0: 'PORT_PIC2_CMD',
472
+ 0x00a1: 'PORT_PIC2_DATA',
473
+ 0x00b2: 'PORT_SMI_CMD',
474
+ 0x00b3: 'PORT_SMI_STATUS',
475
+ 0x00d4: 'PORT_DMA2_MASK_REG',
476
+ 0x00d6: 'PORT_DMA2_MODE_REG',
477
+ 0x00da: 'PORT_DMA2_MASTER_CLEAR',
478
+ 0x00f0: 'PORT_MATH_CLEAR',
479
+ 0x0170: 'PORT_ATA2_CMD_BASE',
480
+ 0x01f0: 'PORT_ATA1_CMD_BASE',
481
+ 0x0278: 'PORT_LPT2',
482
+ 0x02e8: 'PORT_SERIAL4',
483
+ 0x02f8: 'PORT_SERIAL2',
484
+ 0x0374: 'PORT_ATA2_CTRL_BASE',
485
+ 0x0378: 'PORT_LPT1',
486
+ 0x03e8: 'PORT_SERIAL3',
487
+ //0x03f4: "PORT_ATA1_CTRL_BASE",
488
+ 0x03f0: 'PORT_FD_BASE',
489
+ 0x03f2: 'PORT_FD_DOR',
490
+ 0x03f4: 'PORT_FD_STATUS',
491
+ 0x03f5: 'PORT_FD_DATA',
492
+ 0x03f6: 'PORT_HD_DATA',
493
+ 0x03f7: 'PORT_FD_DIR',
494
+ 0x03f8: 'PORT_SERIAL1',
495
+ 0x0cf8: 'PORT_PCI_CMD',
496
+ 0x0cf9: 'PORT_PCI_REBOOT',
497
+ 0x0cfc: 'PORT_PCI_DATA',
498
+ 0x0402: 'PORT_BIOS_DEBUG',
499
+ 0x0510: 'PORT_QEMU_CFG_CTL',
500
+ 0x0511: 'PORT_QEMU_CFG_DATA',
501
+ 0xb000: 'PORT_ACPI_PM_BASE',
502
+ 0xb100: 'PORT_SMB_BASE',
503
+ 0x8900: 'PORT_BIOS_APM',
504
+ }