From 2e93336e828debdaeddd7a34231b50e3a1c57377 Mon Sep 17 00:00:00 2001 From: Ivan Poddubny Date: Thu, 13 Oct 2005 17:50:36 +0000 Subject: [PATCH] All exceptions use Interrupt Gate Better FPU exception handler Code cleanups Correct save_registers for i40 handler (syscall trace) Updated memmap.inc git-svn-id: svn://kolibrios.org@6 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/fpu.inc | 62 ------ kernel/trunk/core/sched.inc | 22 +-- kernel/trunk/core/sys32.inc | 356 +++++++++++++--------------------- kernel/trunk/core/syscall.inc | 88 +++------ kernel/trunk/kernel32.inc | 1 - kernel/trunk/memmap.inc | 24 +-- 6 files changed, 173 insertions(+), 380 deletions(-) delete mode 100644 kernel/trunk/core/fpu.inc diff --git a/kernel/trunk/core/fpu.inc b/kernel/trunk/core/fpu.inc deleted file mode 100644 index cf450751a6..0000000000 --- a/kernel/trunk/core/fpu.inc +++ /dev/null @@ -1,62 +0,0 @@ -iglobal - prev_user_of_fpu dd 0x1 ; set to OS -endg - -label fpu_tss at 0xB080 -label fpu_stack dword at 0xB060 - - -align 4 -fpu_handler: - - ; clear TS flag in CR0 -> for task switching - clts - - ; save FPU context of the previous task - mov eax,[prev_user_of_fpu] - shl eax,8 - add eax,0x80000+0x10 - fsave [eax] - - ; next task switch save our FPU context - ; now restore context of current task (if exists) - mov eax,[0x3000] - mov [prev_user_of_fpu],eax - shl eax,8 - add eax,0x80000 - cmp [eax+0x7f],byte 0 - je bs7_first_fpu - frstor [eax+0x10] - bs7_first_fpu: - mov [eax+0x7f],byte 1 - - ; prepare structure in stack for proper IRET - movzx eax,word [fpu_tss+l.ss-tss_sceleton] ; push ss - push eax - mov eax,[fpu_tss+l.esp-tss_sceleton] ; push esp - push eax - mov eax,[fpu_tss+l.eflags-tss_sceleton] ; push eflags - push eax - - movzx eax,word [fpu_tss+l.cs-tss_sceleton] ; push cs - push eax - mov eax,[fpu_tss+l.eip-tss_sceleton] ; push eip - push eax - - ; save eax - push dword [fpu_tss+l.eax-tss_sceleton] - - ; restore all segment registers - mov ax,[fpu_tss+l.es-tss_sceleton] - mov es,ax - mov ax,[fpu_tss+l.fs-tss_sceleton] - mov fs,ax - mov ax,[fpu_tss+l.gs-tss_sceleton] - mov gs,ax - mov ax,[fpu_tss+l.ds-tss_sceleton] - mov ds,ax - - ; restore eax - pop eax - - iret diff --git a/kernel/trunk/core/sched.inc b/kernel/trunk/core/sched.inc index 7cabdf89eb..3470a85faa 100644 --- a/kernel/trunk/core/sched.inc +++ b/kernel/trunk/core/sched.inc @@ -5,23 +5,13 @@ label timer_ticks dword at 0xFDF0 ;; IRQ0 HANDLER (TIMER INTERRUPT) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + align 32 irq0: - cmp [error_interrupt],-1 je no_error_in_previous_process - mov edi,[error_interrupt] - shl edi, 3 - mov [edi+tss0i_l +5], word 01010000b *256 +11101001b - - mov edi,[error_interrupt] - shl edi,7 - add edi,0x290000 - mov esi,[error_interrupt_entry] - mov [edi+l.eip-tss_sceleton],esi - mov [edi+l.eflags-tss_sceleton],dword 0x11002 - mov [0xffff],byte 0 mov [error_interrupt],-1 @@ -85,13 +75,6 @@ irq0: do_not_change_task: - ;mov edx,[0x3000] - ;lea edx,[tss0sys+8*edx] - ;mov [8*0x40+idts+8+0], word 0 - ;mov [8*0x40+idts+8+2],dx - ;mov [8*0x40+idts+8+4],word 11100101b*256 - ;mov [8*0x40+idts+8+6], word 0 - call _rdtsc mov [edi+0x18],eax @@ -113,6 +96,7 @@ irq0: .switch: jmp pword [0xB000] inc [context_counter] ;noname & halyavin + jmp irq0 iglobal diff --git a/kernel/trunk/core/sys32.inc b/kernel/trunk/core/sys32.inc index 9908cd1d20..e1c1cb2d89 100644 --- a/kernel/trunk/core/sys32.inc +++ b/kernel/trunk/core/sys32.inc @@ -68,7 +68,6 @@ gdte: -; idtreg: dw 8*0x41-1 dd idts+8 @@ -76,20 +75,8 @@ idtreg: label idts at 0xB100-8 ;idte = idts + 8 + 0x60 -; ; old code below: -;align 32 - -;idts: -; dw idte-$-1 -; dd idts+8 -; dw 0 - -; times 0x62 dd 0,0 - -;idte: - build_process_gdt_tss_pointer: mov ecx,tss_data @@ -177,44 +164,32 @@ build_interrupt_table: mov edi,0 mov edx,tss0i - setidtl2: + @@: mov [edi+idts+ 8 +0], word 0 mov [edi+idts+ 8 +2], dx mov [edi+idts+ 8 +4], word 10000101b*256 ; task gate DPL=0 -; cmp edi,0x40*8 -; jne no_sw_int -; mov [edi+idts+ 8 +4], word 11100101b*256 ; task gate DPL=3 -; no_sw_int: mov [edi+idts+ 8 +6], word 0 add edx,8 add edi,8 - cmp edi,8*0x40 ;0x60 - jbe setidtl2 ;jb - -; -; THIS CODE WON'T WORK ;-( -; because each process's 0-level stack points to the same area -; and if task switch occurs and another process is being interrupted -; a stack overflow happens -; The only way to solve that problem is to disable interrupts -; while 0x40-handler is working -; Then we have to make all entries in the IDT INTERRUPT gates, not TASK -; mov edi, idts+8 -; mov esi, sys_int -; mov ecx, 32 -; @@: -; mov eax, [esi] -; mov [edi], ax ; lower part of offset -; mov [edi+2], word os_code ; segment selector -; shr eax, 16 -; mov [edi+4], word 10001110b shl 8 ; interrupt descriptor -; mov [edi+6], ax -; add esi, 4 -; add edi, 8 -; dec ecx -; jnz @b -; + cmp edi,8*0x40 + jb @b + + ; Exceptions + mov edi, idts+8 + mov esi, sys_int + mov ecx, 32 + @@: + mov eax, [esi] + mov [edi], ax ; lower part of offset + mov [edi+2], word os_code ; segment selector + shr eax, 16 + mov [edi+4], word 10001110b shl 8 ; interrupt descriptor + mov [edi+6], ax + add esi, 4 + add edi, 8 + dec ecx + jnz @b ret @@ -230,32 +205,6 @@ build_syscall_interrupt_table: ret -align 4 -i38: - ; load data selectors - pushfd - push ds es - push eax - mov ax, os_data - mov ds, ax - mov es, ax - pop eax - - pushad - push edi - mov edi, eax - mov eax, ebx - mov ebx, ecx - mov ecx, edx - mov esi, [esp] - and edi, 0xFF - call dword [servetable+edi*4] - add esp, 4 - popad - pop es ds - popfd -iret - iglobal sys_int: @@ -311,7 +260,9 @@ uglobal endg s0: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x0 mov [error_interrupt_entry],dword s0 @@ -325,7 +276,9 @@ s0: s1: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x1 mov [error_interrupt_entry],dword s1 @@ -338,7 +291,9 @@ s1: jmp change_task s2: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x2 mov [error_interrupt_entry],dword s2 @@ -351,7 +306,9 @@ s2: jmp change_task s3: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x3 mov [error_interrupt_entry],dword s3 @@ -364,7 +321,9 @@ s3: jmp change_task s4: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x4 mov [error_interrupt_entry],dword s4 @@ -377,7 +336,9 @@ s4: jmp change_task s5: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x5 mov [error_interrupt_entry],dword s5 @@ -390,7 +351,9 @@ s5: jmp change_task s6: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x6 mov [error_interrupt_entry],dword s6 @@ -409,54 +372,45 @@ s6: align 4 s7: - ; - cli - ; - mov edi, 7*8 - mov [edi+gdts+ tss0i +5], word 01010000b *256 +11101001b + clts + + push eax + push ds es + + mov ax, os_data + mov ds, ax + mov es, ax + + mov eax, [prev_user_of_fpu] + shl eax, 8 + add eax, 0x80000 + 0x10 + fsave [eax] + + mov eax, [0x3000] + mov [prev_user_of_fpu], eax + shl eax, 8 + add eax, 0x80000 + cmp [eax + 0x7f], byte 0 + je @f + frstor [eax+0x10] + @@: + mov [eax + 0x7f], byte 1 + + pop es ds + pop eax + + iret + +iglobal + prev_user_of_fpu dd 1 +endg - mov edi,[0x3000] - shl edi, 3 - mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b - - - ; save a copy of current task's TSS to fpu_tss - mov esi,[0x3000] - imul esi,tss_step - add esi,tss_data - mov edi,fpu_tss - mov ecx,120/4 - cld - rep movsd - - ; get base address of our TSS and... - mov esi,[0x3000] - imul esi,tss_step - add esi,tss_data - - ; ...init segments, stack, eip, flags - mov word [esi+l.cs-tss_sceleton],int_code - mov word [esi+l.ss-tss_sceleton],int_data - mov word [esi+l.ds-tss_sceleton],int_data - mov word [esi+l.es-tss_sceleton],int_data - mov word [esi+l.fs-tss_sceleton],int_data - mov word [esi+l.gs-tss_sceleton],int_data - mov dword [esi+l.esp-tss_sceleton],fpu_stack+4*8 - mov dword [esi+l.eip-tss_sceleton],fpu_handler - mov dword [esi+l.eflags-tss_sceleton],0x11002 - - ; then execute this task - mov ebx, [0x3000] - shl ebx,3 - add ebx, tss0 ;t - mov [0xB004], bx - - jmp pword [0xB000] - - jmp s7 s8: - cli + add esp, 4 ; zero on the stack! + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x8 mov [error_interrupt_entry],dword s8 @@ -469,7 +423,9 @@ s8: jmp change_task s9: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x9 mov [error_interrupt_entry],dword s9 @@ -481,8 +437,12 @@ s9: jmp change_task +; Invalid TSS sa: - cli + add esp, 4 ; error code + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0xa mov [error_interrupt_entry],dword sa @@ -494,8 +454,12 @@ sa: jmp change_task +; Segment not present sb: - cli + add esp, 4 + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0xb mov [error_interrupt_entry],dword sb @@ -507,8 +471,12 @@ sb: jmp change_task +; Stack fault exception sc: - cli + add esp, 4 + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0xc mov [error_interrupt_entry],dword sc @@ -520,8 +488,12 @@ sc: jmp change_task +; General Protection Fault sd: - cli + add esp, 4 + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0xd mov [error_interrupt_entry],dword sd @@ -533,8 +505,12 @@ sd: jmp change_task +; Page-Fault Exception se: - cli + add esp, 4 + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0xe mov [error_interrupt_entry],dword se @@ -546,8 +522,11 @@ se: jmp change_task +; ?? sf: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0xf mov [error_interrupt_entry],dword sf @@ -559,8 +538,11 @@ sf: jmp change_task +; x87 FPU Floating-Point Error s10: - cli + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x10 mov [error_interrupt_entry],dword s10 @@ -572,8 +554,12 @@ s10: jmp change_task +; Alignment Check Exception s11: - cli + add esp, 4 + mov ax, os_data + mov ds, ax + mov es, ax mov [error_interrupt],0x11 mov [error_interrupt_entry],dword s11 @@ -585,6 +571,9 @@ s11: jmp change_task + + + writehex: pusha @@ -679,46 +668,9 @@ show_error_parameters: jmp .out_eip -irq5: - call restore_caller - mov dx,word [sb16] - add dx,0xe - in al,dx - -; mov byte [SB16_Status],0 - - mov [check_idle_semaphore],5 - - mov al,0x20 - out 0x20,al - - call return_to_caller - - jmp irq5 - -irqD: - - call restore_caller - - mov dx,0xf0 - mov al,0 - out dx,al - - mov dx,0xa0 - mov al,0x20 - out dx,al - mov dx,0x20 - out dx,al - - mov ds,cx - mov es,cx - mov fs,cx - - call return_to_caller - - jmp irqD +; irq1 -> hid/keyboard.inc p_irq2: @@ -843,16 +795,23 @@ p_irq12: jmp p_irq12 -p_irq13: +irqD: + call restore_caller - call restore_caller + mov dx,0xf0 + mov al,0 + out dx,al - mov edi,13 - call irqhandler + mov dx,0xa0 + mov al,0x20 + out dx,al + mov dx,0x20 + out dx,al call return_to_caller - jmp p_irq13 + jmp irqD + p_irq14: @@ -977,11 +936,9 @@ irqhandler: ret -; this code should never get control! -; applications can use only 0x40 interrupt +; simply return control to interrupted process unknown_interrupt: - @@: call change_task - jmp @b + iret @@ -1020,21 +977,6 @@ clear_application_table_status: ret -uglobal - old_code_0 dd 0x0 - old_code_1 dd 0x0 - - ; - - new_code_0 dd 0x0 - new_code_1 dd 0x0 - - new_data_0 dd 0x0 - new_data_1 dd 0x0 - - new_pos dd 0x0 - new_amount dd 0x0 -endg sys_resize_app_memory: @@ -1121,10 +1063,7 @@ start_application_hd: jmp new_start_application_hd uglobal - ;threadstring dd 0x0 new_process_place dd 0x0 - ;check_processes dd 0x0 - ;dec3004 db 0x0 app_start dd 0x0 app_i_end dd 0x0 app_mem dd 0x0 @@ -1132,8 +1071,6 @@ uglobal app_i_param dd 0x0 app_i_icon dd 0x0 app_mem_pos dd 0x0 - ;thread_create dd 0x0 - ;gdt_place dd 0x0 appl_path dd 0x0 appl_path_size dd 0x0 endg @@ -1186,8 +1123,6 @@ terminate: ; terminate application mov eax,esi call dispose_app_cr3_table - mov [first_gdt_search],0x2 ; start gdt search from beginning - cmp [prev_user_of_fpu],esi ; if user fpu last -> fpu user = 1 jne fpu_ok_1 mov [prev_user_of_fpu],1 @@ -1196,18 +1131,6 @@ terminate: ; terminate application mov [0xf400],byte 0 ; empty keyboard buffer mov [0xf500],byte 0 ; empty button buffer -; mov ecx,esi ; clear memory reserv. -; shl ecx,3 -; mov [ecx+gdts+ app_code-3 +0],dword 0 -; mov [ecx+gdts+ app_code-3 +4],dword 0 -; mov [ecx+gdts+ app_data-3 +0],dword 0 -; mov [ecx+gdts+ app_data-3 +4],dword 0 - - mov edi, esi - - - mov [usedi40+eax],byte 0 - mov ecx,esi ; remove buttons bnewba2: @@ -1398,8 +1321,7 @@ terminate: ; terminate application popa mov edi,esi ; do not run this process slot - shl edi, 5 ;imul edi,0x20 -; add edi,0x3000 + shl edi, 5 mov [edi+0x300A],byte 9 ; call systest sti ; .. and life goes on @@ -1443,12 +1365,6 @@ endg build_scheduler: - ; { Ivan 06.03.2005 - mov edi, usedi40 - mov ecx, 256/4 - xor eax, eax - rep stosd - ; } Ivan 06.03.2005 mov esi,boot_sched_1 call boot_log diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index a0d7fe5856..85ee6631eb 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -4,8 +4,9 @@ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; uglobal - task_tss rd 1 + pushed_regs rd 1 endg + align 32 i40: pushad @@ -14,45 +15,36 @@ i40: mov ax,word os_data mov ds,ax mov es,ax - mov [task_tss],esp - add dword [task_tss],4 + mov [pushed_regs],esp + add dword [pushed_regs],4 cli - mov edi,[0x3000] - mov eax,edi - shl edi, 3 -;clear busy flag in application's TSS - mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b - - - shl edi,5 + mov eax, [0x3000] + mov edi, eax + shl edi, 8 mov [edi+0x80000+0xB0],eax ; used i40 handler ; for syscall trace function call save_registers -; mov esi, [0x3000] -; imul esi, tss_step -; add esi, tss_data - mov esi,[task_tss] -; sub esi,0x28 - ; esi holds address of TSS of interupted program + mov esi,[pushed_regs] + ; load first 3 registers - mov eax,[esi+28];+l.eax-tss_sceleton] - mov ebx,[esi+16];l.ebx-tss_sceleton] - mov ecx,[esi+24];l.ecx-tss_sceleton] + mov eax,[esi+28] + mov ebx,[esi+16] + mov ecx,[esi+24] ; save current registers ; stack may be modified by a system function to return some value to caller! pushad ; load all registers from TSS of the application, in crossed order (why?) - mov edi,[esi+28];l.eax-tss_sceleton] - mov eax,[esi+16];l.ebx-tss_sceleton] - mov ebx,[esi+24];l.ecx-tss_sceleton] - mov ecx,[esi+20];l.edx-tss_sceleton] - mov edx,[esi+4];l.esi-tss_sceleton] - mov esi,[esi+0];l.edi-tss_sceleton] + mov edi,[esi+28] + mov eax,[esi+16] + mov ebx,[esi+24] + mov ecx,[esi+20] + mov edx,[esi+4] + mov esi,[esi+0] ; enable interupts - a task switch or an IRQ _CAN_ interrupt i40 handler sti @@ -66,16 +58,10 @@ i40: ; return saved and probably even changed regs popad - ; esi already loaded - look above "pusha" - ;mov esi,[0x3000] - ;imul esi,tss_step - ;add esi,tss_data - ; - ; modify 3 program's registers (in its TSS) - mov [esi+28],eax;[esi+l.eax-tss_sceleton], eax - mov [esi+16],ebx;[esi+l.ebx-tss_sceleton], ebx - mov [esi+24],ecx;[esi+l.ecx-tss_sceleton], ecx + mov [esi+28],eax + mov [esi+16],ebx + mov [esi+24],ecx xor eax, eax mov edi, [0x3000] ; no syscall interrupt in use anymore @@ -89,36 +75,11 @@ i40: popad iretd - jmp i40 - -label reg1 dword at 0x6000 -label reg2 dword at 0x6400 -label usedi40 byte at 0x6800 - -uglobal - schd dd 0x0 -endg - align 4 save_registers: - - mov esi,[0x3000] - imul esi,tss_step - add esi,tss_data - - mov eax,[esi+l.eax-tss_sceleton] - mov ebx,[esi+l.ebx-tss_sceleton] - mov ecx,[esi+l.ecx-tss_sceleton] - mov edx,[esi+l.edx-tss_sceleton] - mov edi,[esi+l.edi-tss_sceleton] - mov ebp,[esi+l.ebp-tss_sceleton] - - mov esi,[esi+l.esi-tss_sceleton] - - push eax ecx esi edi - mov esi,[0x3010] - mov eax,[esi+0x4] - mov esi,esp + mov esi, [0x3010] + mov eax, [esi+0x4] ; load PID + mov esi, [pushed_regs] inc [save_syscall_count] mov edi,[save_syscall_count] and edi,0xF @@ -128,7 +89,6 @@ save_registers: mov ecx,32 / 4 cld rep movsd - pop edi esi ecx eax ret uglobal diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index 34298524f5..c4335773c6 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -34,7 +34,6 @@ ends fix } struct_helper name@struct include "core/sync.inc" include "core/sys32.inc" ; process management include "core/sched.inc" ; process scheduling -include "core/fpu.inc" ; FPU handler include "core/syscall.inc" ; system call include "core/mem.inc" ; high-level memory management include "core/newproce.inc" ;new process management diff --git a/kernel/trunk/memmap.inc b/kernel/trunk/memmap.inc index beb5af88ea..f9b40f5ddf 100644 --- a/kernel/trunk/memmap.inc +++ b/kernel/trunk/memmap.inc @@ -51,12 +51,10 @@ ; ;!!! ; 5000 -> 5FFF save_syscall_data - syscall trace -; 6000 -> 63FF reg1 array - for i40 (first parts of saved TSS descriptor) -; 6400 -> 67FF reg2 array - same thing, second part -; 6800 -> 68FF used i40 (1 if used, 0 if free), first element not used +; 6000 -> 68FF free ; 6900 -> 6EFF saved picture under mouse pointer ; -; 6F00 -> 7FFF i38 stack (4,25Kb) +; 6F00 -> 7FFF free ; ; 8000 -> A3FF used FLOPPY driver ; @@ -65,11 +63,10 @@ ; B000 -> B005 jump address for irq0 (task switch) ; B008 -> B00B count of ticks remaining to updating CPU usage info ; -; B060 -> B07F fpu error handler's stack -; B080 -> B0FF fpu_tss -> temporary TSS for FPU context switching +; B060 -> B0FF free + ; B100 -> B2FF IDT -; B300 -> BAFF tasknum array - for i40 handler -; BB00 -> BEFF free +; B300 -> BEFF free ;!!! ; BF00 -> BFFF bytes, 1 if process running/memory in use @@ -137,9 +134,9 @@ ; 30000 -> 36FFF basic text font II ; 37000 -> 3BFFF basic text font I ; 40000 -> 4FFFF data of retrieved disks and partitions (Mario79) -; 50000 -> 500FF TSS of scheduler +; 50000 -> 500FF free ; 51000 -> 54000 esp0,esp1,esp2 -; 5F000 -> 5FFFF schedulers stack +; 5F000 -> 5FFFF free ; 60000 -> 7FFFF paging tables ; 80000 -> 8FFFF additional app info, in 256 byte steps - 256 entries ; @@ -171,7 +168,7 @@ ; 284000 -> 28FFFF free ; ; 290000 -> 297FFF TSS's of interrupts -; 298000 -> 29FFFF TSS's of SYSTEM interrupts - 256 entries +; 298000 -> 29FFFF free ; 2A0000 -> 2B00ff wav device data ; 2C0000 -> 2C3fff button info ; @@ -213,7 +210,6 @@ ; ; 800000 -> BFFFFF mapped to LFB ; -; C00000 -> DFFFFF * Application information ; ; C00000 -> C01FFF draw_data - 256 entries ; @@ -227,8 +223,8 @@ ; - system interrupt stacks ; - 256 entries * 4096 step ; -; D20000 -> DA8000 TSS and IO map for (2048*8)=16384 ports -; (128+2048)*256 = 557956 = 0x88000 +; D20000 -> F28000 TSS and IO map for (8192*8)=65536 ports +; (128+8192)*256 = 557956 = 0x88000 ; ; 1000000 -> 3FFFFFF for applications ;