|
|
| version 1.1, 2003/12/08 00:55:31 | version 1.9, 2011/01/15 17:17:23 |
|---|---|
| Line 1 | Line 1 |
| /* $Id$ */ | |
| /* | /* |
| * Copyright (c) 2003 NONAKA Kimihiro | * Copyright (c) 2003 NONAKA Kimihiro |
| * All rights reserved. | * All rights reserved. |
| Line 12 | Line 10 |
| * 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the | * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. | * documentation and/or other materials provided with the distribution. |
| * 3. The name of the author may not be used to endorse or promote products | |
| * derived from this software without specific prior written permission. | |
| * | * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| Line 34 | Line 30 |
| extern "C" { | extern "C" { |
| #endif | #endif |
| typedef union { | void load_tr(UINT16 selector); |
| struct { | void get_stack_pointer_from_tss(UINT pl, UINT16 *new_ss, UINT32 *new_esp); |
| WORD backlink; /* 元のタスクセレクタ値 */ | UINT16 get_backlink_selector_from_tss(void); |
| struct { | |
| WORD sp; /* スタックポインタ */ | |
| WORD ss; /* スタックセグメント */ | |
| } stack[3]; /* 特権レベル 0-2 */ | |
| WORD ip; /* IP */ | |
| WORD flags; /* FLAGS */ | |
| WORD regs[8]; /* レジスタ */ | |
| WORD sreg[4]; /* セグメントレジスタ */ | |
| WORD ldt; /* タスク毎の LDT セレクタ値 */ | |
| } tss16; | |
| struct { | |
| REG32 backlink; /* REG16: 元のタスクセレクタ値 */ | |
| struct { | |
| REG32 sp; /* REG32: スタックポインタ */ | |
| REG32 ss; /* REG16: スタックセグメント */ | |
| } stack[3]; /* 特権レベル 0-2 */ | |
| REG32 cr3; /* REG32: タスク毎の CR3 */ | |
| REG32 ip; /* REG32: EIP */ | |
| REG32 flags; /* REG32: EFLAGS */ | |
| REG32 regs[8]; /* REG32: レジスタ */ | |
| REG32 sreg[6]; /* REG16: セグメントレジスタ */ | |
| REG32 ldt; /* REG16: タスク毎の LDT セレクタ値 */ | |
| WORD t; /* 最下位ビットが1のとき、タスク切替時 | |
| に割り込み番号1のフォールトを発生 */ | |
| WORD iobase; /* TSS 先頭から I/O 許可テーブルマップ | |
| までのバイト数 */ | |
| } tss32; | |
| } TASK_STATE_T; | |
| void load_tr(WORD selector); | |
| void get_stack_from_tss(BYTE pl, WORD* new_ss, DWORD* new_esp); | |
| WORD get_link_selector_from_tss(); | |
| void task_switch(selector_t* selector, int type); | |
| /* type */ | /* task_switch type */ |
| enum { | typedef enum { |
| TASK_SWITCH_JMP, | TASK_SWITCH_JMP, |
| TASK_SWITCH_CALL, | TASK_SWITCH_CALL, |
| TASK_SWITCH_IRET, | TASK_SWITCH_IRET, |
| TASK_SWITCH_INTR, | TASK_SWITCH_INTR |
| }; | } task_switch_type_t; |
| void task_switch(selector_t *selector, task_switch_type_t type); | |
| #ifdef __cplusplus | #ifdef __cplusplus |
| } | } |