Changeset 811770c in mainline for kernel/arch/amd64/include
- Timestamp:
- 2016-05-05T12:06:04Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 57c2a87
- Parents:
- 0f17bff
- Location:
- kernel/arch/amd64/include/arch
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/include/arch/asm.h
r0f17bff r811770c 208 208 } 209 209 210 /** Enable interrupts. 211 * 212 * Enable interrupts and return previous 213 * value of EFLAGS. 214 * 215 * @return Old interrupt priority level. 216 * 217 */ 218 NO_TRACE static inline ipl_t interrupts_enable(void) { 219 ipl_t v; 220 210 NO_TRACE static inline uint64_t read_rflags(void) 211 { 212 uint64_t rflags; 213 221 214 asm volatile ( 222 215 "pushfq\n" 223 216 "popq %[v]\n" 224 "sti\n" 225 : [v] "=r" (v) 226 ); 227 228 return v; 217 : [v] "=r" (rflags) 218 ); 219 220 return rflags; 221 } 222 223 NO_TRACE static inline void write_rflags(uint64_t rflags) 224 { 225 asm volatile ( 226 "pushq %[v]\n" 227 "popfq\n" 228 :: [v] "r" (rflags) 229 ); 230 } 231 232 /** Return interrupt priority level. 233 * 234 * Return the current interrupt priority level. 235 * 236 * @return Current interrupt priority level. 237 */ 238 NO_TRACE static inline ipl_t interrupts_read(void) { 239 return (ipl_t) read_rflags(); 240 } 241 242 /** Enable interrupts. 243 * 244 * Enable interrupts and return the previous interrupt priority level. 245 * 246 * @return Old interrupt priority level. 247 */ 248 NO_TRACE static inline ipl_t interrupts_enable(void) { 249 ipl_t ipl = interrupts_read(); 250 251 asm volatile ("sti\n"); 252 253 return ipl; 229 254 } 230 255 231 256 /** Disable interrupts. 232 257 * 233 * Disable interrupts and return previous 234 * value of EFLAGS. 258 * Disable interrupts and return the previous interrupt priority level. 235 259 * 236 260 * @return Old interrupt priority level. 237 *238 261 */ 239 262 NO_TRACE static inline ipl_t interrupts_disable(void) { 240 ipl_t v; 241 242 asm volatile ( 243 "pushfq\n" 244 "popq %[v]\n" 245 "cli\n" 246 : [v] "=r" (v) 247 ); 248 249 return v; 263 ipl_t ipl = interrupts_read(); 264 265 asm volatile ("cli\n"); 266 267 return ipl; 250 268 } 251 269 252 270 /** Restore interrupt priority level. 253 271 * 254 * Restore EFLAGS.272 * Restore the previously save interrupt priority level. 255 273 * 256 274 * @param ipl Saved interrupt priority level. … … 258 276 */ 259 277 NO_TRACE static inline void interrupts_restore(ipl_t ipl) { 260 asm volatile ( 261 "pushq %[ipl]\n" 262 "popfq\n" 263 :: [ipl] "r" (ipl) 264 ); 265 } 266 267 /** Return interrupt priority level. 268 * 269 * Return EFLAFS. 270 * 271 * @return Current interrupt priority level. 272 * 273 */ 274 NO_TRACE static inline ipl_t interrupts_read(void) { 275 ipl_t v; 276 277 asm volatile ( 278 "pushfq\n" 279 "popq %[v]\n" 280 : [v] "=r" (v) 281 ); 282 283 return v; 278 write_rflags((uint64_t) ipl); 284 279 } 285 280 … … 291 286 NO_TRACE static inline bool interrupts_disabled(void) 292 287 { 293 ipl_t v; 294 295 asm volatile ( 296 "pushfq\n" 297 "popq %[v]\n" 298 : [v] "=r" (v) 299 ); 300 301 return ((v & RFLAGS_IF) == 0); 288 return ((read_rflags() & RFLAGS_IF) == 0); 302 289 } 303 290 … … 324 311 325 312 return ((uint64_t) dx << 32) | ax; 326 }327 328 /** Enable local APIC329 *330 * Enable local APIC in MSR.331 *332 */333 NO_TRACE static inline void enable_l_apic_in_msr(void)334 {335 asm volatile (336 "movl $0x1b, %%ecx\n"337 "rdmsr\n"338 "orl $(1 << 11),%%eax\n"339 "orl $(0xfee00000),%%eax\n"340 "wrmsr\n"341 ::: "%eax", "%ecx", "%edx"342 );343 313 } 344 314 … … 426 396 427 397 GEN_READ_REG(cr0) 398 GEN_WRITE_REG(cr0) 428 399 GEN_READ_REG(cr2) 429 400 GEN_READ_REG(cr3) 430 401 GEN_WRITE_REG(cr3) 402 GEN_READ_REG(cr4) 403 GEN_WRITE_REG(cr4) 431 404 432 405 GEN_READ_REG(dr0) … … 512 485 extern uintptr_t int_63; 513 486 487 extern void enable_l_apic_in_msr(void); 488 514 489 #endif 515 490 -
kernel/arch/amd64/include/arch/cpu.h
r0f17bff r811770c 36 36 #define KERN_amd64_CPU_H_ 37 37 38 #define RFLAGS_CF (1 << 0) 39 #define RFLAGS_PF (1 << 2) 40 #define RFLAGS_AF (1 << 4) 41 #define RFLAGS_ZF (1 << 6) 42 #define RFLAGS_SF (1 << 7) 43 #define RFLAGS_TF (1 << 8) 44 #define RFLAGS_IF (1 << 9) 45 #define RFLAGS_DF (1 << 10) 46 #define RFLAGS_OF (1 << 11) 47 #define RFLAGS_NT (1 << 14) 48 #define RFLAGS_RF (1 << 16) 38 #define RFLAGS_CF (1 << 0) 39 #define RFLAGS_PF (1 << 2) 40 #define RFLAGS_AF (1 << 4) 41 #define RFLAGS_ZF (1 << 6) 42 #define RFLAGS_SF (1 << 7) 43 #define RFLAGS_TF (1 << 8) 44 #define RFLAGS_IF (1 << 9) 45 #define RFLAGS_DF (1 << 10) 46 #define RFLAGS_OF (1 << 11) 47 #define RFLAGS_IOPL (3 << 12) 48 #define RFLAGS_NT (1 << 14) 49 #define RFLAGS_RF (1 << 16) 50 #define RFLAGS_ID (1 << 21) 49 51 50 #define EFER_MSR_NUM 0xc0000080 51 #define AMD_SCE_FLAG 0 52 #define AMD_LME_FLAG 8 53 #define AMD_LMA_FLAG 10 54 #define AMD_FFXSR_FLAG 14 55 #define AMD_NXE_FLAG 11 52 #define CR0_MP (1 << 1) 53 #define CR0_EM (1 << 2) 54 #define CR0_TS (1 << 3) 55 #define CR0_AM (1 << 18) 56 #define CR0_PG (1 << 31) 57 58 #define CR4_PAE (1 << 5) 59 #define CR4_OSFXSR (1 << 9) 60 61 /* EFER bits */ 62 #define AMD_SCE (1 << 0) 63 #define AMD_LME (1 << 8) 64 #define AMD_LMA (1 << 10) 65 #define AMD_NXE (1 << 11) 66 #define AMD_FFXSR (1 << 14) 67 68 #define AMD_APIC_BASE_GE (1 << 11) 56 69 57 70 /* MSR registers */ 71 #define AMD_MSR_APIC_BASE 0x0000001b 72 #define AMD_MSR_EFER 0xc0000080 58 73 #define AMD_MSR_STAR 0xc0000081 59 74 #define AMD_MSR_LSTAR 0xc0000082 … … 85 100 }; 86 101 87 extern void set_efer_flag(int flag);88 extern uint64_t read_efer_flag(void);89 102 void cpu_setup_fpu(void); 90 103
Note:
See TracChangeset
for help on using the changeset viewer.
