Changeset 762a824 in mainline


Ignore:
Timestamp:
2006-05-01T14:44:37Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
16dad032
Parents:
0f27b4c
Message:

ppc32: proper exception handling from user-space
code cleanup

Location:
arch/ppc32
Files:
13 edited

Legend:

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

    r0f27b4c r762a824  
    4141 */
    4242static inline ipl_t interrupts_enable(void) {
    43         ipl_t v;
     43        ipl_t v = 0;
    4444        ipl_t tmp;
    4545       
    46         __asm__ volatile (
     46        asm volatile (
    4747                "mfmsr %0\n"
    4848                "mfmsr %1\n"
     
    6565        ipl_t tmp;
    6666       
    67         __asm__ volatile (
     67        asm volatile (
    6868                "mfmsr %0\n"
    6969                "mfmsr %1\n"
     
    8484        ipl_t tmp;
    8585       
    86         __asm__ volatile (
     86        asm volatile (
    8787                "mfmsr %1\n"
    8888                "rlwimi  %0, %1, 0, 17, 15\n"
     
    104104static inline ipl_t interrupts_read(void) {
    105105        ipl_t v;
    106         __asm__ volatile (
     106       
     107        asm volatile (
    107108                "mfmsr %0\n"
    108109                : "=r" (v)
     
    121122        __address v;
    122123       
    123         __asm__ volatile ("and %0, %%sp, %1\n" : "=r" (v) : "r" (~(STACK_SIZE-1)));
    124        
     124        asm volatile (
     125                "and %0, %%sp, %1\n"
     126                : "=r" (v)
     127                : "r" (~(STACK_SIZE - 1))
     128        );
    125129        return v;
    126130}
  • arch/ppc32/include/asm/regname.h

    r0f27b4c r762a824  
    195195#define msr_ir  (1 << 4)
    196196#define msr_dr  (1 << 5)
     197#define msr_pr  (1 << 14)
     198#define msr_ee  (1 << 15)
    197199
    198200/* HID0 bits */
  • arch/ppc32/include/atomic.h

    r0f27b4c r762a824  
    3434        long tmp;
    3535
    36         asm __volatile__ (
     36        asm volatile (
    3737                "1:\n"
    3838                "lwarx %0, 0, %2\n"
     
    4242                : "=&r" (tmp), "=m" (val->count)
    4343                : "r" (&val->count), "m" (val->count)
    44                 : "cc");
     44                : "cc"
     45        );
    4546}
    4647
     
    4950        long tmp;
    5051
    51         asm __volatile__(
     52        asm volatile (
    5253                "1:\n"
    5354                "lwarx %0, 0, %2\n"
     
    5758                : "=&r" (tmp), "=m" (val->count)
    5859                : "r" (&val->count), "m" (val->count)
    59                 : "cc");
     60                : "cc"
     61        );
    6062}
    6163
  • arch/ppc32/include/barrier.h

    r0f27b4c r762a824  
    3030#define __ppc32_BARRIER_H__
    3131
    32 #define CS_ENTER_BARRIER()      __asm__ volatile ("" ::: "memory")
    33 #define CS_LEAVE_BARRIER()      __asm__ volatile ("" ::: "memory")
     32#define CS_ENTER_BARRIER()      asm volatile ("" ::: "memory")
     33#define CS_LEAVE_BARRIER()      asm volatile ("" ::: "memory")
    3434
    35 #define memory_barrier() __asm__ volatile ("sync" ::: "memory")
    36 #define read_barrier() __asm__ volatile ("sync" ::: "memory")
    37 #define write_barrier() __asm__ volatile ("eieio" ::: "memory")
     35#define memory_barrier() asm volatile ("sync" ::: "memory")
     36#define read_barrier() asm volatile ("sync" ::: "memory")
     37#define write_barrier() asm volatile ("eieio" ::: "memory")
    3838
    3939#endif
  • arch/ppc32/include/byteorder.h

    r0f27b4c r762a824  
    5252        __address v;
    5353       
    54         __asm__ volatile ("lwbrx %0, %1, %2\n" : "=r" (v) : "i" (0) , "r" (&n));
    55        
     54        asm volatile (
     55                "lwbrx %0, %1, %2\n"
     56                : "=r" (v)
     57                : "i" (0), "r" (&n)
     58        );
    5659        return v;
    5760}
     61
    5862#endif
  • arch/ppc32/include/cpuid.h

    r0f27b4c r762a824  
    3939static inline void cpu_version(struct cpu_info *info)
    4040{
    41         __asm__ volatile (
    42                 "mfspr %0, 287\n"
     41        asm volatile (
     42                "mfpvr %0\n"
    4343                : "=r" (*info)
    4444        );
  • arch/ppc32/include/exception.h

    r0f27b4c r762a824  
    4848        __u32 r10;
    4949        __u32 r11;
    50         __u32 r12;
    5150        __u32 r13;
    5251        __u32 r14;
  • arch/ppc32/include/interrupt.h

    r0f27b4c r762a824  
    3030#define __ppc32_INTERRUPT_H__
    3131
    32 #define IRQ_COUNT       1       /* TODO */
    33 
     32#define IRQ_COUNT       1
    3433#define IVT_ITEMS   15
    3534#define INT_OFFSET  0
  • arch/ppc32/src/asm.S

    r0f27b4c r762a824  
    4040        # r3 = uspace_uarg
    4141        # r4 = stack
    42         # r5 = entry   
     42        # r5 = entry
     43       
     44        # disable interrupts
    4345
    4446        mfmsr r31
     
    5254        # set problem state, enable interrupts
    5355       
    54         ori r31, r31, 1 << 14
    55         ori r31, r31, 1 << 15
     56        ori r31, r31, msr_pr
     57        ori r31, r31, msr_ee
    5658        mtsrr1 r31
    5759       
     
    6567
    6668iret:
    67         lwz r3, 144(sp)
    68         mtxer r3
    69        
    70         lwz r3, 140(sp)
    71         mtctr r3
    72        
    73         lwz r3, 136(sp)
    74         mtcr r3
    75        
    76         lwz r3, 132(sp)
    77         mtlr r3
    78        
    79         lwz r3, 128(sp)
    80         mtspr srr1, r3
    81        
    82         lwz r3, 124(sp)
    83         mtspr srr0, r3
    84        
    8569        lwz r0, 0(sp)
    8670        lwz r2, 4(sp)
     
    9478        lwz r10, 36(sp)
    9579        lwz r11, 40(sp)
    96         lwz r12, 44(sp)
    97         lwz r13, 48(sp)
    98         lwz r14, 52(sp)
    99         lwz r15, 56(sp)
    100         lwz r16, 60(sp)
    101         lwz r17, 64(sp)
    102         lwz r18, 68(sp)
    103         lwz r19, 72(sp)
    104         lwz r20, 76(sp)
    105         lwz r21, 80(sp)
    106         lwz r22, 84(sp)
    107         lwz r23, 88(sp)
    108         lwz r24, 92(sp)
    109         lwz r25, 96(sp)
    110         lwz r26, 100(sp)
    111         lwz r27, 104(sp)
    112         lwz r28, 108(sp)
    113         lwz r29, 112(sp)
    114         lwz r30, 116(sp)
    115         lwz r31, 120(sp)
    116        
    117         mfspr sp, sprg1
     80        lwz r13, 44(sp)
     81        lwz r14, 48(sp)
     82        lwz r15, 52(sp)
     83        lwz r16, 56(sp)
     84        lwz r17, 60(sp)
     85        lwz r18, 64(sp)
     86        lwz r19, 68(sp)
     87        lwz r20, 72(sp)
     88        lwz r21, 76(sp)
     89        lwz r22, 80(sp)
     90        lwz r23, 84(sp)
     91        lwz r24, 88(sp)
     92        lwz r25, 92(sp)
     93        lwz r26, 96(sp)
     94        lwz r27, 100(sp)
     95        lwz r28, 104(sp)
     96        lwz r29, 108(sp)
     97        lwz r30, 112(sp)
     98        lwz r31, 116(sp)
     99       
     100        lwz r12, 120(sp)
     101        mtsrr0 r12
     102       
     103        lwz r12, 124(sp)
     104        mtsrr1 r12
     105       
     106        lwz r12, 128(sp)
     107        mtlr r12
     108       
     109        lwz r12, 132(sp)
     110        mtcr r12
     111       
     112        lwz r12, 136(sp)
     113        mtctr r12
     114       
     115        lwz r12, 140(sp)
     116        mtxer r12
     117
     118        mfsprg1 sp
     119        mfsprg2 r12
    118120       
    119121        rfi
  • arch/ppc32/src/boot/boot.S

    r0f27b4c r762a824  
    3535kernel_image_start:
    3636
    37         # load temporary stack
     37        # load temporal kernel stack
    3838       
    39         lis sp, end_stack@ha
    40         addi sp, sp, end_stack@l
     39        lis sp, kernel_stack@ha
     40        addi sp, sp, kernel_stack@l
     41       
     42        # set kernel stack for interrupt handling
     43       
     44        mr r31, sp
     45        subis r31, r31, 0x8000
     46        mtsprg0 r31
    4147       
    4248        # r3 contains physical address of bootinfo_t
    4349        # r4 contains size of bootinfo_t
    4450       
    45         lis r31, 0x80000000@ha
    46         addi r31, r31, 0x80000000@l
    47        
    48         add r3, r3, r31
     51        addis r3, r3, 0x8000
    4952
    5053        lis r31, bootinfo@ha
     
    7376.section K_DATA_START, "aw", @progbits
    7477
     78.align 12
     79kernel_stack_bottom:
    7580        .space TEMP_STACK_SIZE
    76 end_stack:
     81kernel_stack:
  • arch/ppc32/src/exception.S

    r0f27b4c r762a824  
    3333
    3434.macro CONTEXT_STORE
    35         mtspr sprg1, sp
    36        
    37         subis sp, sp, 0x8000
    38        
    39         subi sp, sp, 144
     35       
     36        # save SP in SPRG1
     37        # save R12 in SPRG2, backup CR in R12
     38
     39        mtsprg1 sp
     40        mtsprg2 r12
     41        mfcr r12
     42       
     43        # check whether SP is in kernel
     44       
     45        andis. sp, sp, 0x8000
     46        bne 1f
     47       
     48                # stack is in user-space
     49               
     50                mfsprg0 sp
     51       
     52        b 2f
     53       
     54        1:
     55       
     56                # stack is in kernel
     57               
     58                mfsprg1 sp
     59                subis sp, sp, 0x8000
     60       
     61        2:
     62       
     63        subi sp, sp, 140
    4064        stw r0, 0(sp)
    4165        stw r2, 4(sp)
     
    4973        stw r10, 36(sp)
    5074        stw r11, 40(sp)
    51         stw r12, 44(sp)
    52         stw r13, 48(sp)
    53         stw r14, 52(sp)
    54         stw r15, 56(sp)
    55         stw r16, 60(sp)
    56         stw r17, 64(sp)
    57         stw r18, 68(sp)
    58         stw r19, 72(sp)
    59         stw r20, 76(sp)
    60         stw r21, 80(sp)
    61         stw r22, 84(sp)
    62         stw r23, 88(sp)
    63         stw r24, 92(sp)
    64         stw r25, 96(sp)
    65         stw r26, 100(sp)
    66         stw r27, 104(sp)
    67         stw r28, 108(sp)
    68         stw r29, 112(sp)
    69         stw r30, 116(sp)
    70         stw r31, 120(sp)
    71        
    72         mfspr r3, srr0
     75        stw r13, 44(sp)
     76        stw r14, 48(sp)
     77        stw r15, 52(sp)
     78        stw r16, 56(sp)
     79        stw r17, 60(sp)
     80        stw r18, 64(sp)
     81        stw r19, 68(sp)
     82        stw r20, 72(sp)
     83        stw r21, 76(sp)
     84        stw r22, 80(sp)
     85        stw r23, 84(sp)
     86        stw r24, 88(sp)
     87        stw r25, 92(sp)
     88        stw r26, 96(sp)
     89        stw r27, 100(sp)
     90        stw r28, 104(sp)
     91        stw r29, 108(sp)
     92        stw r30, 112(sp)
     93        stw r31, 116(sp)
     94       
     95        mfsrr0 r3
     96        stw r3, 120(sp)
     97       
     98        mfsrr1 r3
    7399        stw r3, 124(sp)
    74100       
    75         mfspr r3, srr1
     101        mflr r3
    76102        stw r3, 128(sp)
    77103       
    78         mflr r3
    79         stw r3, 132(sp)
    80        
    81         mfcr r3
     104        stw r12, 132(sp)
     105       
     106        mfctr r3
    82107        stw r3, 136(sp)
    83108       
    84         mfctr r3
     109        mfxer r3
    85110        stw r3, 140(sp)
    86        
    87         mfxer r3
    88         stw r3, 144(sp)
    89111.endm
    90112
     
    103125exc_data_storage:
    104126        CONTEXT_STORE
    105 
     127       
    106128        lis r3, pht_refill@ha
    107129        addi r3, r3, pht_refill@l
    108         mtspr srr0, r3
     130        mtsrr0 r3
    109131       
    110132        mfmsr r3
    111133        ori r3, r3, (msr_ir | msr_dr)@l
    112         mtspr srr1, r3
     134        mtsrr1 r3
    113135       
    114136        lis r3, iret@ha
     
    117139       
    118140        addis sp, sp, 0x8000
     141        mr r3, sp
    119142        rfi
    120143
     
    122145.global exc_instruction_storage
    123146exc_instruction_storage:
    124         b exc_instruction_storage
    125 
    126 .org 0x480
    127 .global exc_instruction_segment
    128 exc_instruction_segment:
    129         b exc_instruction_segment
     147        CONTEXT_STORE
     148       
     149        lis r3, pht_refill@ha
     150        addi r3, r3, pht_refill@l
     151        mtsrr0 r3
     152       
     153        mfmsr r3
     154        ori r3, r3, (msr_ir | msr_dr)@l
     155        mtsrr1 r3
     156       
     157        lis r3, iret@ha
     158        addi r3, r3, iret@l
     159        mtlr r3
     160       
     161        addis sp, sp, 0x8000
     162        mr r3, sp
     163        rfi
    130164
    131165.org 0x500
     
    156190        lis r3, exc_dispatch@ha
    157191        addi r3, r3, exc_dispatch@l
    158         mtspr srr0, r3
     192        mtsrr0 r3
    159193       
    160194        mfmsr r3
    161195        ori r3, r3, (msr_ir | msr_dr)@l
    162         mtspr srr1, r3
     196        mtsrr1 r3
    163197       
    164198        lis r3, iret@ha
     
    168202        addis sp, sp, 0x8000
    169203        li r3, 10
     204        mr r4, sp
    170205        rfi
    171206
  • arch/ppc32/src/interrupt.c

    r0f27b4c r762a824  
    3232#include <arch.h>
    3333#include <time/clock.h>
    34 #include <print.h>
    3534#include <ipc/sysipc.h>
     35
    3636
    3737void start_decrementer(void)
  • arch/ppc32/src/proc/scheduler.c

    r0f27b4c r762a824  
    2828
    2929#include <arch/mm/page.h>
     30#include <arch/boot/boot.h>
    3031#include <proc/scheduler.h>
    3132#include <proc/thread.h>
    3233#include <arch.h>
    33 
    34 __address supervisor_sp;
    35 __address supervisor_sp_physical;
    3634
    3735/** Perform ppc32 specific tasks needed before the new task is run. */
     
    4341void before_thread_runs_arch(void)
    4442{
    45         supervisor_sp = (__address) &THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA];
    46         supervisor_sp_physical = KA2PA(supervisor_sp_physical);
     43        asm volatile (
     44                "mtsprg0 %0\n"
     45                :
     46                : "r" (KA2PA(&THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA]))
     47        );
    4748}
    4849
Note: See TracChangeset for help on using the changeset viewer.