Changeset 0f17bff in mainline for kernel/arch/ia32/include/arch/asm.h
- Timestamp:
- 2016-05-05T08:34:45Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 811770c
- Parents:
- 4b0206c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/include/arch/asm.h
r4b0206c r0f17bff 87 87 GEN_WRITE_REG(cr3) 88 88 89 GEN_WRITE_REG(cr0) 90 89 91 GEN_READ_REG(dr0) 90 92 GEN_READ_REG(dr1) … … 232 234 } 233 235 234 /** Enable interrupts. 235 * 236 * Enable interrupts and return previous 237 * value of EFLAGS. 238 * 239 * @return Old interrupt priority level. 240 * 241 */ 242 NO_TRACE static inline ipl_t interrupts_enable(void) 243 { 244 ipl_t v; 245 236 NO_TRACE static inline uint32_t read_eflags(void) 237 { 238 uint32_t eflags; 239 246 240 asm volatile ( 247 241 "pushf\n" 248 242 "popl %[v]\n" 249 "sti\n" 250 : [v] "=r" (v) 251 ); 252 253 return v; 243 : [v] "=r" (eflags) 244 ); 245 246 return eflags; 247 } 248 249 NO_TRACE static inline void write_eflags(uint32_t eflags) 250 { 251 asm volatile ( 252 "pushl %[v]\n" 253 "popf\n" 254 :: [v] "r" (eflags) 255 ); 256 } 257 258 /** Return interrupt priority level. 259 * 260 * @return Current interrupt priority level. 261 */ 262 NO_TRACE static inline ipl_t interrupts_read(void) 263 { 264 return (ipl_t) read_eflags(); 265 } 266 267 /** Enable interrupts. 268 * 269 * Enable interrupts and return the previous interrupt priority level. 270 * 271 * @return Old interrupt priority level. 272 */ 273 NO_TRACE static inline ipl_t interrupts_enable(void) 274 { 275 ipl_t ipl = interrupts_read(); 276 277 asm volatile ("sti\n"); 278 279 return ipl; 254 280 } 255 281 256 282 /** Disable interrupts. 257 283 * 258 * Disable interrupts and return previous 259 * value of EFLAGS. 284 * Disable interrupts and return the previous interrupt priority level. 260 285 * 261 286 * @return Old interrupt priority level. 262 *263 287 */ 264 288 NO_TRACE static inline ipl_t interrupts_disable(void) 265 289 { 266 ipl_t v; 267 268 asm volatile ( 269 "pushf\n" 270 "popl %[v]\n" 271 "cli\n" 272 : [v] "=r" (v) 273 ); 274 275 return v; 290 ipl_t ipl = interrupts_read(); 291 292 asm volatile ("cli\n"); 293 294 return ipl; 276 295 } 277 296 278 297 /** Restore interrupt priority level. 279 298 * 280 * Restore EFLAGS.299 * Restore a saved interrupt priority level. 281 300 * 282 301 * @param ipl Saved interrupt priority level. … … 285 304 NO_TRACE static inline void interrupts_restore(ipl_t ipl) 286 305 { 287 asm volatile ( 288 "pushl %[ipl]\n" 289 "popf\n" 290 :: [ipl] "r" (ipl) 291 ); 292 } 293 294 /** Return interrupt priority level. 295 * 296 * @return EFLAFS. 297 * 298 */ 299 NO_TRACE static inline ipl_t interrupts_read(void) 300 { 301 ipl_t v; 302 303 asm volatile ( 304 "pushf\n" 305 "popl %[v]\n" 306 : [v] "=r" (v) 307 ); 308 309 return v; 306 write_eflags((uint32_t) ipl); 310 307 } 311 308 … … 317 314 NO_TRACE static inline bool interrupts_disabled(void) 318 315 { 319 ipl_t v; 320 321 asm volatile ( 322 "pushf\n" 323 "popl %[v]\n" 324 : [v] "=r" (v) 325 ); 326 327 return ((v & EFLAGS_IF) == 0); 316 return ((read_eflags() & EFLAGS_IF) == 0); 328 317 } 329 318
Note:
See TracChangeset
for help on using the changeset viewer.