Changeset 811770c in mainline for kernel/arch/amd64/include/arch/asm.h


Ignore:
Timestamp:
2016-05-05T12:06:04Z (9 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
57c2a87
Parents:
0f17bff
Message:

Avoid magic numbers and specialized functions to set/get register bits

File:
1 edited

Legend:

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

    r0f17bff r811770c  
    208208}
    209209
    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        
     210NO_TRACE static inline uint64_t read_rflags(void)
     211{
     212        uint64_t rflags;
     213
    221214        asm volatile (
    222215                "pushfq\n"
    223216                "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
     223NO_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 */
     238NO_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 */
     248NO_TRACE static inline ipl_t interrupts_enable(void) {
     249        ipl_t ipl = interrupts_read();
     250       
     251        asm volatile ("sti\n");
     252       
     253        return ipl;
    229254}
    230255
    231256/** Disable interrupts.
    232257 *
    233  * Disable interrupts and return previous
    234  * value of EFLAGS.
     258 * Disable interrupts and return the previous interrupt priority level.
    235259 *
    236260 * @return Old interrupt priority level.
    237  *
    238261 */
    239262NO_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;
    250268}
    251269
    252270/** Restore interrupt priority level.
    253271 *
    254  * Restore EFLAGS.
     272 * Restore the previously save interrupt priority level.
    255273 *
    256274 * @param ipl Saved interrupt priority level.
     
    258276 */
    259277NO_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);
    284279}
    285280
     
    291286NO_TRACE static inline bool interrupts_disabled(void)
    292287{
    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);
    302289}
    303290
     
    324311       
    325312        return ((uint64_t) dx << 32) | ax;
    326 }
    327 
    328 /** Enable local APIC
    329  *
    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         );
    343313}
    344314
     
    426396
    427397GEN_READ_REG(cr0)
     398GEN_WRITE_REG(cr0)
    428399GEN_READ_REG(cr2)
    429400GEN_READ_REG(cr3)
    430401GEN_WRITE_REG(cr3)
     402GEN_READ_REG(cr4)
     403GEN_WRITE_REG(cr4)
    431404
    432405GEN_READ_REG(dr0)
     
    512485extern uintptr_t int_63;
    513486
     487extern void enable_l_apic_in_msr(void);
     488
    514489#endif
    515490
Note: See TracChangeset for help on using the changeset viewer.