Changeset df7f5cea in mainline for kernel/arch/ppc32/src


Ignore:
Timestamp:
2014-08-25T23:03:50Z (11 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1c635d6, 3ab2d1e
Parents:
6dbe7f68
Message:

Experimental support for hard-floats on ppc32.

  • By default disabled.
Location:
kernel/arch/ppc32/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ppc32/src/cpu/cpu.c

    r6dbe7f68 rdf7f5cea  
    3737#include <arch.h>
    3838#include <print.h>
     39#include <fpu_context.h>
    3940
    4041void cpu_arch_init(void)
    4142{
     43#ifdef CONFIG_FPU
     44        fpu_enable();
     45#endif
    4246}
    4347
     
    5256       
    5357        switch (cpu->arch.version) {
    54                 case 8:
    55                         name = "PowerPC 750";
    56                         break;
    57                 case 9:
    58                         name = "PowerPC 604e";
    59                         break;
    60                 case 0x81:
    61                         name = "PowerPC 8260";
    62                         break;
    63                 case 0x8081:
    64                         name = "PowerPC 826xA";
    65                         break;
    66                 default:
    67                         name = "unknown";
     58        case 8:
     59                name = "PowerPC 750";
     60                break;
     61        case 9:
     62                name = "PowerPC 604e";
     63                break;
     64        case 0x81:
     65                name = "PowerPC 8260";
     66                break;
     67        case 0x8081:
     68                name = "PowerPC 826xA";
     69                break;
     70        default:
     71                name = "unknown";
    6872        }
    6973       
  • kernel/arch/ppc32/src/exception.S

    r6dbe7f68 rdf7f5cea  
    258258        mtsrr0 r12
    259259       
     260        mfsrr1 r5
     261        andi. r5, r5, MSR_FP
    260262        mfmsr r12
     263        or r12, r12, r5         # Propagate MSR_FP from SRR1 to MSR
    261264        ori r12, r12, (MSR_IR | MSR_DR)@l
    262265        mtsrr1 r12
     
    276279        addi r12, r12, iret_syscall@l
    277280        mtlr r12
    278        
     281
     282        mfsrr1 r0
     283        andi. r0, r0, MSR_FP
    279284        mfmsr r12
     285        or r12, r12, r0         # Propagate MSR_FP from SRR1 to MSR
    280286        ori r12, r12, (MSR_IR | MSR_DR)@l
    281287        mtsrr1 r12
  • kernel/arch/ppc32/src/fpu_context.S

    r6dbe7f68 rdf7f5cea  
    2929#include <arch/asm/regname.h>
    3030#include <arch/context_offset.h>
     31#include <arch/msr.h>
    3132
    3233.text
     
    3940
    4041.macro FPU_CONTEXT_STORE r
     42        stfd fr0, OFFSET_FR0(\r)
     43        stfd fr1, OFFSET_FR1(\r)
     44        stfd fr2, OFFSET_FR2(\r)
     45        stfd fr3, OFFSET_FR3(\r)
     46        stfd fr4, OFFSET_FR4(\r)
     47        stfd fr5, OFFSET_FR5(\r)
     48        stfd fr6, OFFSET_FR6(\r)
     49        stfd fr7, OFFSET_FR7(\r)
     50        stfd fr8, OFFSET_FR8(\r)
     51        stfd fr9, OFFSET_FR9(\r)
     52        stfd fr10, OFFSET_FR10(\r)
     53        stfd fr11, OFFSET_FR11(\r)
     54        stfd fr12, OFFSET_FR12(\r)
     55        stfd fr13, OFFSET_FR13(\r)
    4156        stfd fr14, OFFSET_FR14(\r)
    4257        stfd fr15, OFFSET_FR15(\r)
     
    6075
    6176.macro FPU_CONTEXT_LOAD r
     77        lfd fr0, OFFSET_FR0(\r)
     78        lfd fr1, OFFSET_FR1(\r)
     79        lfd fr2, OFFSET_FR2(\r)
     80        lfd fr3, OFFSET_FR3(\r)
     81        lfd fr4, OFFSET_FR4(\r)
     82        lfd fr5, OFFSET_FR5(\r)
     83        lfd fr6, OFFSET_FR6(\r)
     84        lfd fr7, OFFSET_FR7(\r)
     85        lfd fr8, OFFSET_FR8(\r)
     86        lfd fr9, OFFSET_FR9(\r)
     87        lfd fr10, OFFSET_FR10(\r)
     88        lfd fr11, OFFSET_FR11(\r)
     89        lfd fr12, OFFSET_FR12(\r)
     90        lfd fr13, OFFSET_FR13(\r)
    6291        lfd fr14, OFFSET_FR14(\r)
    6392        lfd fr15, OFFSET_FR15(\r)
     
    81110
    82111fpu_context_save:
    83 //      FPU_CONTEXT_STORE r3
    84 //     
    85 //      mffs fr0
    86 //      stfd fr0, OFFSET_FPSCR(r3)
     112        FPU_CONTEXT_STORE r3
     113       
     114        mffs fr0
     115        stfd fr0, OFFSET_FPSCR(r3)
    87116       
    88117        blr
    89118
    90119fpu_context_restore:
    91 //      FPU_CONTEXT_LOAD r3
    92 //     
    93 //      lfd fr0, OFFSET_FPSCR(r3)
    94 //      mtfsf 7, fr0
     120        lfd fr0, OFFSET_FPSCR(r3)
     121        mtfsf 7, fr0
     122
     123        FPU_CONTEXT_LOAD r3
    95124       
    96125        blr
    97126
    98127fpu_init:
     128        mfmsr r0
     129        ori r0, r0, MSR_FP
     130
     131        # Disable FPU exceptions
     132        li r3, MSR_FE0 | MSR_FE1
     133        andc r0, r0, r3
     134
     135        mtmsr r0
    99136        blr
    100137
    101138fpu_enable:
     139        mfmsr r0
     140        ori r0, r0, MSR_FP
     141        mtmsr r0
    102142        blr
    103143
    104144fpu_disable:
     145        mfmsr r0
     146        li r3, MSR_FP
     147        andc r0, r0, r3
     148        mtmsr r0
    105149        blr
     150
  • kernel/arch/ppc32/src/interrupt.c

    r6dbe7f68 rdf7f5cea  
    112112{
    113113        uint8_t inum;
    114        
     114
    115115        while ((inum = pic_get_pending()) != 255) {
    116116                irq_t *irq = irq_dispatch_and_lock(inum);
     
    146146}
    147147
     148static void exception_fp_unavailable(unsigned int n, istate_t *istate)
     149{
     150#ifdef CONFIG_FPU_LAZY
     151        scheduler_fpu_lazy_request();
     152        /*
     153         * Propagate MSR_FP from MSR back to istate's SRR1, which will become
     154         * the next MSR.
     155         */
     156        istate->srr1 |= msr_read() & MSR_FP;
     157#else
     158        fault_if_from_uspace(istate, "FPU fault.");
     159        panic_badtrap(istate, n, "FPU fault.");
     160#endif
     161}
     162
    148163static void exception_decrementer(unsigned int n, istate_t *istate)
    149164{
     
    161176        exc_register(VECTOR_EXTERNAL, "external", true,
    162177            exception_external);
     178        exc_register(VECTOR_FP_UNAVAILABLE, "fp_unavailable", true,
     179            exception_fp_unavailable);
    163180        exc_register(VECTOR_DECREMENTER, "timer", true,
    164181            exception_decrementer);
Note: See TracChangeset for help on using the changeset viewer.