Ignore:
File:
1 edited

Legend:

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

    r7a0359b rc22e964  
    2727 */
    2828
    29 /** @addtogroup ppc32
     29/** @addtogroup ppc32   
    3030 * @{
    3131 */
     
    3636#define KERN_ppc32_ASM_H_
    3737
     38#include <arch/types.h>
    3839#include <typedefs.h>
    3940#include <config.h>
    40 #include <arch/cpu.h>
    41 #include <arch/mm/asid.h>
    42 #include <trace.h>
    43 
    44 NO_TRACE static inline uint32_t msr_read(void)
    45 {
    46         uint32_t msr;
    47        
    48         asm volatile (
    49                 "mfmsr %[msr]\n"
    50                 : [msr] "=r" (msr)
    51         );
    52        
    53         return msr;
    54 }
    55 
    56 NO_TRACE static inline void msr_write(uint32_t msr)
    57 {
    58         asm volatile (
    59                 "mtmsr %[msr]\n"
    60                 :: [msr] "r" (msr)
    61         );
    62 }
    63 
    64 NO_TRACE static inline void sr_set(uint32_t flags, asid_t asid, uint32_t sr)
    65 {
    66         asm volatile (
    67                 "mtsrin %[value], %[sr]\n"
    68                 :: [value] "r" ((flags << 16) + (asid << 4) + sr),
    69                    [sr] "r" (sr << 28)
    70         );
    71 }
    72 
    73 NO_TRACE static inline uint32_t sr_get(uint32_t vaddr)
    74 {
    75         uint32_t vsid;
    76        
    77         asm volatile (
    78                 "mfsrin %[vsid], %[vaddr]\n"
    79                 : [vsid] "=r" (vsid)
    80                 : [vaddr] "r" (vaddr)
    81         );
    82        
    83         return vsid;
    84 }
    85 
    86 NO_TRACE static inline uint32_t sdr1_get(void)
    87 {
    88         uint32_t sdr1;
    89        
    90         asm volatile (
    91                 "mfsdr1 %[sdr1]\n"
    92                 : [sdr1] "=r" (sdr1)
    93         );
    94        
    95         return sdr1;
    96 }
    9741
    9842/** Enable interrupts.
     
    10246 *
    10347 * @return Old interrupt priority level.
    104  *
    10548 */
    106 NO_TRACE static inline ipl_t interrupts_enable(void)
     49static inline ipl_t interrupts_enable(void)
    10750{
    108         ipl_t ipl = msr_read();
    109         msr_write(ipl | MSR_EE);
    110         return ipl;
     51        ipl_t v;
     52        ipl_t tmp;
     53       
     54        asm volatile (
     55                "mfmsr %0\n"
     56                "mfmsr %1\n"
     57                "ori %1, %1, 1 << 15\n"
     58                "mtmsr %1\n"
     59                : "=r" (v), "=r" (tmp)
     60        );
     61        return v;
    11162}
    11263
     
    11768 *
    11869 * @return Old interrupt priority level.
    119  *
    12070 */
    121 NO_TRACE static inline ipl_t interrupts_disable(void)
     71static inline ipl_t interrupts_disable(void)
    12272{
    123         ipl_t ipl = msr_read();
    124         msr_write(ipl & (~MSR_EE));
    125         return ipl;
     73        ipl_t v;
     74        ipl_t tmp;
     75       
     76        asm volatile (
     77                "mfmsr %0\n"
     78                "mfmsr %1\n"
     79                "rlwinm %1, %1, 0, 17, 15\n"
     80                "mtmsr %1\n"
     81                : "=r" (v), "=r" (tmp)
     82        );
     83        return v;
    12684}
    12785
     
    13189 *
    13290 * @param ipl Saved interrupt priority level.
    133  *
    13491 */
    135 NO_TRACE static inline void interrupts_restore(ipl_t ipl)
     92static inline void interrupts_restore(ipl_t ipl)
    13693{
    137         msr_write((msr_read() & (~MSR_EE)) | (ipl & MSR_EE));
     94        ipl_t tmp;
     95       
     96        asm volatile (
     97                "mfmsr %1\n"
     98                "rlwimi  %0, %1, 0, 17, 15\n"
     99                "cmpw 0, %0, %1\n"
     100                "beq 0f\n"
     101                "mtmsr %0\n"
     102                "0:\n"
     103                : "=r" (ipl), "=r" (tmp)
     104                : "0" (ipl)
     105                : "cr0"
     106        );
    138107}
    139108
     
    143112 *
    144113 * @return Current interrupt priority level.
    145  *
    146114 */
    147 NO_TRACE static inline ipl_t interrupts_read(void)
     115static inline ipl_t interrupts_read(void)
    148116{
    149         return msr_read();
    150 }
    151 
    152 /** Check whether interrupts are disabled.
    153  *
    154  * @return True if interrupts are disabled.
    155  *
    156  */
    157 NO_TRACE static inline bool interrupts_disabled(void)
    158 {
    159         return ((msr_read() & MSR_EE) == 0);
     117        ipl_t v;
     118       
     119        asm volatile (
     120                "mfmsr %0\n"
     121                : "=r" (v)
     122        );
     123        return v;
    160124}
    161125
     
    165129 * The stack is assumed to be STACK_SIZE bytes long.
    166130 * The stack must start on page boundary.
    167  *
    168131 */
    169 NO_TRACE static inline uintptr_t get_stack_base(void)
     132static inline uintptr_t get_stack_base(void)
    170133{
    171         uintptr_t base;
     134        uintptr_t v;
    172135       
    173136        asm volatile (
    174                 "and %[base], %%sp, %[mask]\n"
    175                 : [base] "=r" (base)
    176                 : [mask] "r" (~(STACK_SIZE - 1))
     137                "and %0, %%sp, %1\n"
     138                : "=r" (v)
     139                : "r" (~(STACK_SIZE - 1))
    177140        );
    178        
    179         return base;
     141        return v;
    180142}
    181143
    182 NO_TRACE static inline void cpu_sleep(void)
     144static inline void cpu_sleep(void)
    183145{
    184146}
    185147
    186 NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v)
     148void cpu_halt(void);
     149void asm_delay_loop(uint32_t t);
     150
     151extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry);
     152
     153static inline void pio_write_8(ioport8_t *port, uint8_t v)
    187154{
    188         *port = v;
     155        *port = v;     
    189156}
    190157
    191 NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v)
     158static inline void pio_write_16(ioport16_t *port, uint16_t v)
    192159{
    193         *port = v;
     160        *port = v;     
    194161}
    195162
    196 NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t v)
     163static inline void pio_write_32(ioport32_t *port, uint32_t v)
    197164{
    198         *port = v;
     165        *port = v;     
    199166}
    200167
    201 NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port)
     168static inline uint8_t pio_read_8(ioport8_t *port)
    202169{
    203         return *port;
     170        return *port; 
    204171}
    205172
    206 NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port)
     173static inline uint16_t pio_read_16(ioport16_t *port)
    207174{
    208         return *port;
     175        return *port; 
    209176}
    210177
    211 NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port)
     178static inline uint32_t pio_read_32(ioport32_t *port)
    212179{
    213         return *port;
     180        return *port; 
    214181}
    215 
    216 extern void cpu_halt(void) __attribute__((noreturn));
    217 extern void asm_delay_loop(uint32_t t);
    218 extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry);
    219182
    220183#endif
Note: See TracChangeset for help on using the changeset viewer.