Changeset 811770c in mainline for kernel/arch/amd64/include/arch/asm.h
- Timestamp:
- 2016-05-05T12:06:04Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 57c2a87
- Parents:
- 0f17bff
- File:
-
- 1 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
Note:
See TracChangeset
for help on using the changeset viewer.