Ignore:
File:
1 edited

Legend:

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

    r82474ef r7a0359b  
    3636#define KERN_ppc32_ASM_H_
    3737
    38 #include <arch/types.h>
    3938#include <typedefs.h>
    4039#include <config.h>
     40#include <arch/cpu.h>
     41#include <arch/mm/asid.h>
     42#include <trace.h>
     43
     44NO_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
     56NO_TRACE static inline void msr_write(uint32_t msr)
     57{
     58        asm volatile (
     59                "mtmsr %[msr]\n"
     60                :: [msr] "r" (msr)
     61        );
     62}
     63
     64NO_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
     73NO_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
     86NO_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}
    4197
    4298/** Enable interrupts.
     
    46102 *
    47103 * @return Old interrupt priority level.
    48  */
    49 static inline ipl_t interrupts_enable(void)
    50 {
    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;
     104 *
     105 */
     106NO_TRACE static inline ipl_t interrupts_enable(void)
     107{
     108        ipl_t ipl = msr_read();
     109        msr_write(ipl | MSR_EE);
     110        return ipl;
    62111}
    63112
     
    68117 *
    69118 * @return Old interrupt priority level.
    70  */
    71 static inline ipl_t interrupts_disable(void)
    72 {
    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;
     119 *
     120 */
     121NO_TRACE static inline ipl_t interrupts_disable(void)
     122{
     123        ipl_t ipl = msr_read();
     124        msr_write(ipl & (~MSR_EE));
     125        return ipl;
    84126}
    85127
     
    89131 *
    90132 * @param ipl Saved interrupt priority level.
    91  */
    92 static inline void interrupts_restore(ipl_t ipl)
    93 {
    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         );
     133 *
     134 */
     135NO_TRACE static inline void interrupts_restore(ipl_t ipl)
     136{
     137        msr_write((msr_read() & (~MSR_EE)) | (ipl & MSR_EE));
    107138}
    108139
     
    112143 *
    113144 * @return Current interrupt priority level.
    114  */
    115 static inline ipl_t interrupts_read(void)
    116 {
    117         ipl_t v;
    118        
    119         asm volatile (
    120                 "mfmsr %0\n"
    121                 : "=r" (v)
    122         );
    123         return v;
     145 *
     146 */
     147NO_TRACE static inline ipl_t interrupts_read(void)
     148{
     149        return msr_read();
     150}
     151
     152/** Check whether interrupts are disabled.
     153 *
     154 * @return True if interrupts are disabled.
     155 *
     156 */
     157NO_TRACE static inline bool interrupts_disabled(void)
     158{
     159        return ((msr_read() & MSR_EE) == 0);
    124160}
    125161
     
    129165 * The stack is assumed to be STACK_SIZE bytes long.
    130166 * The stack must start on page boundary.
    131  */
    132 static inline uintptr_t get_stack_base(void)
    133 {
    134         uintptr_t v;
    135        
    136         asm volatile (
    137                 "and %0, %%sp, %1\n"
    138                 : "=r" (v)
    139                 : "r" (~(STACK_SIZE - 1))
    140         );
    141         return v;
    142 }
    143 
    144 static inline void cpu_sleep(void)
    145 {
     167 *
     168 */
     169NO_TRACE static inline uintptr_t get_stack_base(void)
     170{
     171        uintptr_t base;
     172       
     173        asm volatile (
     174                "and %[base], %%sp, %[mask]\n"
     175                : [base] "=r" (base)
     176                : [mask] "r" (~(STACK_SIZE - 1))
     177        );
     178       
     179        return base;
     180}
     181
     182NO_TRACE static inline void cpu_sleep(void)
     183{
     184}
     185
     186NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v)
     187{
     188        *port = v;
     189}
     190
     191NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v)
     192{
     193        *port = v;
     194}
     195
     196NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t v)
     197{
     198        *port = v;
     199}
     200
     201NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port)
     202{
     203        return *port;
     204}
     205
     206NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port)
     207{
     208        return *port;
     209}
     210
     211NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port)
     212{
     213        return *port;
    146214}
    147215
     
    150218extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry);
    151219
    152 static inline void pio_write_8(ioport8_t *port, uint8_t v)
    153 {
    154         *port = v;
    155 }
    156 
    157 static inline void pio_write_16(ioport16_t *port, uint16_t v)
    158 {
    159         *port = v;
    160 }
    161 
    162 static inline void pio_write_32(ioport32_t *port, uint32_t v)
    163 {
    164         *port = v;
    165 }
    166 
    167 static inline uint8_t pio_read_8(ioport8_t *port)
    168 {
    169         return *port;
    170 }
    171 
    172 static inline uint16_t pio_read_16(ioport16_t *port)
    173 {
    174         return *port;
    175 }
    176 
    177 static inline uint32_t pio_read_32(ioport32_t *port)
    178 {
    179         return *port;
    180 }
    181 
    182220#endif
    183221
Note: See TracChangeset for help on using the changeset viewer.