|
|||
Prex Home / Browse Source - Prex Version: 0.9.0 |
|||
root/bsp/hal/x86/include/cpu.h/* [<][>][^][v][top][bottom][index][help] */INCLUDED FROM1 /*- 2 * Copyright (c) 2005, Kohsuke Ohtani 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the author nor the names of any co-contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #ifndef _X86_CPU_H 31 #define _X86_CPU_H 32 33 #include <sys/cdefs.h> /* for __packed */ 34 35 /* 36 * GDTs 37 */ 38 #define KERNEL_CS 0x10 39 #define KERNEL_DS 0x18 40 #define USER_CS 0x20 41 #define USER_DS 0x28 42 #define KERNEL_TSS 0x38 43 44 #define NGDTS 8 45 46 /* 47 * IDTs 48 */ 49 #define NIDTS 0x41 50 #define SYSCALL_INT 0x40 51 #define INVALID_INT 0xFF 52 53 /* 54 * x86 flags register 55 */ 56 #define EFL_CF 0x00000001 /* Carry */ 57 #define EFL_PF 0x00000004 /* Parity */ 58 #define EFL_AF 0x00000010 /* Carry */ 59 #define EFL_ZF 0x00000040 /* Zero */ 60 #define EFL_SF 0x00000080 /* Sign */ 61 #define EFL_TF 0x00000100 /* Trap */ 62 #define EFL_IF 0x00000200 /* Interrupt enable */ 63 #define EFL_DF 0x00000400 /* Direction */ 64 #define EFL_OF 0x00000800 /* Overflow */ 65 #define EFL_IOPL 0x00003000 /* IO privilege level: */ 66 #define EFL_IOPL_KERN 0x00000000 /* Kernel */ 67 #define EFL_IOPL_USER 0x00003000 /* User */ 68 #define EFL_NT 0x00004000 /* Nested task */ 69 #define EFL_RF 0x00010000 /* Resume without tracing */ 70 #define EFL_VM 0x00020000 /* Virtual 8086 mode */ 71 #define EFL_AC 0x00040000 /* Alignment Check */ 72 73 /* 74 * CR0 register 75 */ 76 #define CR0_PG 0x80000000 /* enable paging */ 77 #define CR0_CD 0x40000000 /* cache disable */ 78 #define CR0_NW 0x20000000 /* no write-through */ 79 #define CR0_AM 0x00040000 /* alignment check mask */ 80 #define CR0_WP 0x00010000 /* write-protect kernel access */ 81 #define CR0_NE 0x00000020 /* handle numeric exceptions */ 82 #define CR0_ET 0x00000010 /* extension type is 80387 coprocessor */ 83 #define CR0_TS 0x00000008 /* task switch */ 84 #define CR0_EM 0x00000004 /* emulate coprocessor */ 85 #define CR0_MP 0x00000002 /* monitor coprocessor */ 86 #define CR0_PE 0x00000001 /* enable protected mode */ 87 88 #ifndef __ASSEMBLY__ 89 90 #include <sys/types.h> 91 #include <context.h> 92 93 #if defined(__SUNPRO_C) 94 #pragma pack(1) 95 #endif 96 97 /* 98 * Segment Descriptor 99 */ 100 struct seg_desc { 101 u_int limit_lo:16; /* segment limit (lsb) */ 102 u_int base_lo:16; /* segment base address (lsb) */ 103 u_int base_mid:8; /* segment base address (middle) */ 104 u_int type:8; /* type */ 105 u_int limit_hi:4; /* segment limit (msb) */ 106 u_int size:4; /* size */ 107 u_int base_hi:8; /* segment base address (msb) */ 108 } __packed; 109 110 /* 111 * Gate Descriptor 112 */ 113 struct gate_desc { 114 u_int offset_lo:16; /* gate offset (lsb) */ 115 u_int selector:16; /* gate segment selector */ 116 u_int nr_copy:8; /* stack copy count */ 117 u_int type:8; /* type */ 118 u_int offset_hi:16; /* gate offset (msb) */ 119 } __packed; 120 121 /* 122 * Linear memory description for lgdt and lidt instructions. 123 */ 124 struct desc_p { 125 uint16_t limit; 126 uint32_t base; 127 } __packed; 128 129 /* 130 * Segment size 131 */ 132 #define SIZE_32 0x4 /* 32-bit segment */ 133 #define SIZE_16 0x0 /* 16-bit segment */ 134 #define SIZE_4K 0x8 /* 4K limit field */ 135 136 /* 137 * Segment type 138 */ 139 #define ST_ACC 0x01 /* accessed */ 140 #define ST_LDT 0x02 /* LDT */ 141 #define ST_CALL_GATE_16 0x04 /* 16-bit call gate */ 142 #define ST_TASK_GATE 0x05 /* task gate */ 143 #define ST_TSS 0x09 /* task segment */ 144 #define ST_CALL_GATE 0x0c /* call gate */ 145 #define ST_INTR_GATE 0x0e /* interrupt gate */ 146 #define ST_TRAP_GATE 0x0f /* trap gate */ 147 148 #define ST_TSS_BUSY 0x02 /* task busy */ 149 150 #define ST_DATA 0x10 /* data */ 151 #define ST_DATA_W 0x12 /* data, writable */ 152 #define ST_DATA_E 0x14 /* data, expand-down */ 153 #define ST_DATA_EW 0x16 /* data, expand-down, writable */ 154 155 #define ST_CODE 0x18 /* code */ 156 #define ST_CODE_R 0x1a /* code, readable */ 157 #define ST_CODE_C 0x1c /* code, conforming */ 158 #define ST_CODE_CR 0x1e /* code, conforming, readable */ 159 160 #define ST_KERN 0x00 /* kernel access only */ 161 #define ST_USER 0x60 /* user access */ 162 163 #define ST_PRESENT 0x80 /* segment present */ 164 165 /* 166 * Task State Segment (TSS) 167 */ 168 169 #define IO_BITMAP_SIZE (65536/8 + 1) 170 #define INVALID_IO_BITMAP 0x8000 171 172 struct tss { 173 uint32_t back_link; 174 uint32_t esp0, ss0; 175 uint32_t esp1, ss1; 176 uint32_t esp2, ss2; 177 uint32_t cr3; 178 uint32_t eip; 179 uint32_t eflags; 180 uint32_t eax, ecx, edx, ebx; 181 uint32_t esp, ebp, esi, edi; 182 uint32_t es, cs, ss, ds, fs, gs; 183 uint32_t ldt; 184 uint16_t dbg_trace; 185 uint16_t io_bitmap_offset; 186 #if 0 187 uint32_t io_bitmap[IO_BITMAP_SIZE/4+1]; 188 uint32_t pad[5]; 189 #endif 190 } __packed; 191 192 193 #if defined(__SUNPRO_C) 194 #pragma pack() 195 #endif 196 197 __BEGIN_DECLS 198 void tss_set(uint32_t); 199 uint32_t tss_get(void); 200 void cpu_init(void); 201 __END_DECLS 202 203 #endif /* !__ASSEMBLY__ */ 204 #endif /* !_X86_CPU_H */ /* [<][>][^][v][top][bottom][index][help] */ | |||
Copyright© 2005-2009 Kohsuke Ohtani |