Changeset 811770c in mainline for kernel/arch/amd64/include


Ignore:
Timestamp:
2016-05-05T12:06:04Z (10 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

Location:
kernel/arch/amd64/include/arch
Files:
2 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
  • kernel/arch/amd64/include/arch/cpu.h

    r0f17bff r811770c  
    3636#define KERN_amd64_CPU_H_
    3737
    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)
    4951
    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)
    5669
    5770/* MSR registers */
     71#define AMD_MSR_APIC_BASE       0x0000001b
     72#define AMD_MSR_EFER            0xc0000080
    5873#define AMD_MSR_STAR            0xc0000081
    5974#define AMD_MSR_LSTAR           0xc0000082
     
    85100};
    86101
    87 extern void set_efer_flag(int flag);
    88 extern uint64_t read_efer_flag(void);
    89102void cpu_setup_fpu(void);
    90103
Note: See TracChangeset for help on using the changeset viewer.