Changeset 0f17bff in mainline for kernel/arch/ia32/include/arch/asm.h


Ignore:
Timestamp:
2016-05-05T08:34:45Z (8 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
811770c
Parents:
4b0206c
Message:

Replace magic numbers with macros

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/include/arch/asm.h

    r4b0206c r0f17bff  
    8787GEN_WRITE_REG(cr3)
    8888
     89GEN_WRITE_REG(cr0)
     90
    8991GEN_READ_REG(dr0)
    9092GEN_READ_REG(dr1)
     
    232234}
    233235
    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        
     236NO_TRACE static inline uint32_t read_eflags(void)
     237{
     238        uint32_t eflags;
     239
    246240        asm volatile (
    247241                "pushf\n"
    248242                "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
     249NO_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 */
     262NO_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 */
     273NO_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;
    254280}
    255281
    256282/** Disable interrupts.
    257283 *
    258  * Disable interrupts and return previous
    259  * value of EFLAGS.
     284 * Disable interrupts and return the previous interrupt priority level.
    260285 *
    261286 * @return Old interrupt priority level.
    262  *
    263287 */
    264288NO_TRACE static inline ipl_t interrupts_disable(void)
    265289{
    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;
    276295}
    277296
    278297/** Restore interrupt priority level.
    279298 *
    280  * Restore EFLAGS.
     299 * Restore a saved interrupt priority level.
    281300 *
    282301 * @param ipl Saved interrupt priority level.
     
    285304NO_TRACE static inline void interrupts_restore(ipl_t ipl)
    286305{
    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);
    310307}
    311308
     
    317314NO_TRACE static inline bool interrupts_disabled(void)
    318315{
    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);
    328317}
    329318
Note: See TracChangeset for help on using the changeset viewer.