Ignore:
File:
1 edited

Legend:

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

    r3500f75 rd99c1d2  
    3838#include <typedefs.h>
    3939#include <config.h>
    40 #include <arch/cpu.h>
    41 
    42 static inline uint32_t msr_read(void)
    43 {
    44         uint32_t msr;
    45        
    46         asm volatile (
    47                 "mfmsr %[msr]\n"
    48                 : [msr] "=r" (msr)
    49         );
    50        
    51         return msr;
    52 }
    53 
    54 static inline void msr_write(uint32_t msr)
    55 {
    56         asm volatile (
    57                 "mtmsr %[msr]\n"
    58                 :: [msr] "r" (msr)
    59         );
    60 }
    6140
    6241/** Enable interrupts.
     
    6645 *
    6746 * @return Old interrupt priority level.
    68  *
    6947 */
    7048static inline ipl_t interrupts_enable(void)
    7149{
    72         ipl_t ipl = msr_read();
    73         msr_write(ipl | MSR_EE);
    74         return ipl;
     50        ipl_t v;
     51        ipl_t tmp;
     52       
     53        asm volatile (
     54                "mfmsr %0\n"
     55                "mfmsr %1\n"
     56                "ori %1, %1, 1 << 15\n"
     57                "mtmsr %1\n"
     58                : "=r" (v), "=r" (tmp)
     59        );
     60        return v;
    7561}
    7662
     
    8167 *
    8268 * @return Old interrupt priority level.
    83  *
    8469 */
    8570static inline ipl_t interrupts_disable(void)
    8671{
    87         ipl_t ipl = msr_read();
    88         msr_write(ipl & (~MSR_EE));
    89         return ipl;
     72        ipl_t v;
     73        ipl_t tmp;
     74       
     75        asm volatile (
     76                "mfmsr %0\n"
     77                "mfmsr %1\n"
     78                "rlwinm %1, %1, 0, 17, 15\n"
     79                "mtmsr %1\n"
     80                : "=r" (v), "=r" (tmp)
     81        );
     82        return v;
    9083}
    9184
     
    9588 *
    9689 * @param ipl Saved interrupt priority level.
    97  *
    9890 */
    9991static inline void interrupts_restore(ipl_t ipl)
    10092{
    101         msr_write((msr_read() & (~MSR_EE)) | (ipl & MSR_EE));
     93        ipl_t tmp;
     94       
     95        asm volatile (
     96                "mfmsr %1\n"
     97                "rlwimi  %0, %1, 0, 17, 15\n"
     98                "cmpw 0, %0, %1\n"
     99                "beq 0f\n"
     100                "mtmsr %0\n"
     101                "0:\n"
     102                : "=r" (ipl), "=r" (tmp)
     103                : "0" (ipl)
     104                : "cr0"
     105        );
    102106}
    103107
     
    107111 *
    108112 * @return Current interrupt priority level.
    109  *
    110113 */
    111114static inline ipl_t interrupts_read(void)
    112115{
    113         return msr_read();
    114 }
    115 
    116 /** Check whether interrupts are disabled.
    117  *
    118  * @return True if interrupts are disabled.
    119  *
    120  */
    121 static inline bool interrupts_disabled(void)
    122 {
    123         return ((msr_read() & MSR_EE) == 0);
     116        ipl_t v;
     117       
     118        asm volatile (
     119                "mfmsr %0\n"
     120                : "=r" (v)
     121        );
     122        return v;
    124123}
    125124
     
    129128 * The stack is assumed to be STACK_SIZE bytes long.
    130129 * The stack must start on page boundary.
    131  *
    132130 */
    133131static inline uintptr_t get_stack_base(void)
    134132{
    135         uintptr_t base;
     133        uintptr_t v;
    136134       
    137135        asm volatile (
    138                 "and %[base], %%sp, %[mask]\n"
    139                 : [base] "=r" (base)
    140                 : [mask] "r" (~(STACK_SIZE - 1))
     136                "and %0, %%sp, %1\n"
     137                : "=r" (v)
     138                : "r" (~(STACK_SIZE - 1))
    141139        );
    142        
    143         return base;
     140        return v;
    144141}
    145142
Note: See TracChangeset for help on using the changeset viewer.