| 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 | 
 | } | } |