Changeset 3500f75 in mainline for kernel/arch/ppc32/include/asm.h


Ignore:
Timestamp:
2010-05-21T22:50:45Z (14 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7c8e1e1
Parents:
339249f
Message:

ppc32: add interrupts_disabled(), simplify CPU identification

File:
1 edited

Legend:

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

    r339249f r3500f75  
    3838#include <typedefs.h>
    3939#include <config.h>
     40#include <arch/cpu.h>
     41
     42static 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
     54static inline void msr_write(uint32_t msr)
     55{
     56        asm volatile (
     57                "mtmsr %[msr]\n"
     58                :: [msr] "r" (msr)
     59        );
     60}
    4061
    4162/** Enable interrupts.
     
    4566 *
    4667 * @return Old interrupt priority level.
     68 *
    4769 */
    4870static inline ipl_t interrupts_enable(void)
    4971{
    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;
     72        ipl_t ipl = msr_read();
     73        msr_write(ipl | MSR_EE);
     74        return ipl;
    6175}
    6276
     
    6781 *
    6882 * @return Old interrupt priority level.
     83 *
    6984 */
    7085static inline ipl_t interrupts_disable(void)
    7186{
    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;
     87        ipl_t ipl = msr_read();
     88        msr_write(ipl & (~MSR_EE));
     89        return ipl;
    8390}
    8491
     
    8895 *
    8996 * @param ipl Saved interrupt priority level.
     97 *
    9098 */
    9199static inline void interrupts_restore(ipl_t ipl)
    92100{
    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         );
     101        msr_write((msr_read() & (~MSR_EE)) | (ipl & MSR_EE));
    106102}
    107103
     
    111107 *
    112108 * @return Current interrupt priority level.
     109 *
    113110 */
    114111static inline ipl_t interrupts_read(void)
    115112{
    116         ipl_t v;
    117        
    118         asm volatile (
    119                 "mfmsr %0\n"
    120                 : "=r" (v)
    121         );
    122         return v;
     113        return msr_read();
     114}
     115
     116/** Check whether interrupts are disabled.
     117 *
     118 * @return True if interrupts are disabled.
     119 *
     120 */
     121static inline bool interrupts_disabled(void)
     122{
     123        return ((msr_read() & MSR_EE) == 0);
    123124}
    124125
     
    128129 * The stack is assumed to be STACK_SIZE bytes long.
    129130 * The stack must start on page boundary.
     131 *
    130132 */
    131133static inline uintptr_t get_stack_base(void)
    132134{
    133         uintptr_t v;
     135        uintptr_t base;
    134136       
    135137        asm volatile (
    136                 "and %0, %%sp, %1\n"
    137                 : "=r" (v)
    138                 : "r" (~(STACK_SIZE - 1))
     138                "and %[base], %%sp, %[mask]\n"
     139                : [base] "=r" (base)
     140                : [mask] "r" (~(STACK_SIZE - 1))
    139141        );
    140         return v;
     142       
     143        return base;
    141144}
    142145
Note: See TracChangeset for help on using the changeset viewer.