forked from Imagelibrary/rtems
@@ -202,7 +202,7 @@ _start:
|
|||||||
subi r1, START_STACK, 2 * PPC_DEFAULT_CACHE_LINE_SIZE
|
subi r1, START_STACK, 2 * PPC_DEFAULT_CACHE_LINE_SIZE
|
||||||
clrrwi r1, r1, PPC_DEFAULT_CACHE_LINE_POWER
|
clrrwi r1, r1, PPC_DEFAULT_CACHE_LINE_POWER
|
||||||
li r0, 0
|
li r0, 0
|
||||||
stw r0, 0(r1)
|
PPC_REG_STORE r0, 0(r1)
|
||||||
|
|
||||||
#ifdef INITIALIZE_FPU
|
#ifdef INITIALIZE_FPU
|
||||||
bl .Linitfpu
|
bl .Linitfpu
|
||||||
@@ -288,7 +288,7 @@ _start_thread:
|
|||||||
subi r1, r3, PPC_MINIMUM_STACK_FRAME_SIZE
|
subi r1, r3, PPC_MINIMUM_STACK_FRAME_SIZE
|
||||||
clrrwi r1, r1, PPC_STACK_ALIGN_POWER
|
clrrwi r1, r1, PPC_STACK_ALIGN_POWER
|
||||||
li r0, 0
|
li r0, 0
|
||||||
stw r0, 0(r1)
|
PPC_REG_STORE r0, 0(r1)
|
||||||
|
|
||||||
#ifdef INITIALIZE_FPU
|
#ifdef INITIALIZE_FPU
|
||||||
bl .Linitfpu
|
bl .Linitfpu
|
||||||
@@ -313,145 +313,145 @@ _start_secondary_processor:
|
|||||||
.align 4
|
.align 4
|
||||||
bsp_exc_vector_base:
|
bsp_exc_vector_base:
|
||||||
/* Critical input */
|
/* Critical input */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 0
|
li r3, 0
|
||||||
b ppc_exc_fatal_critical
|
b ppc_exc_fatal_critical
|
||||||
/* Machine check */
|
/* Machine check */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 1
|
li r3, 1
|
||||||
b ppc_exc_fatal_machine_check
|
b ppc_exc_fatal_machine_check
|
||||||
/* Data storage */
|
/* Data storage */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 2
|
li r3, 2
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Instruction storage */
|
/* Instruction storage */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 3
|
li r3, 3
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* External input */
|
/* External input */
|
||||||
stwu r1, -PPC_EXC_INTERRUPT_FRAME_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -PPC_EXC_INTERRUPT_FRAME_SIZE(r1)
|
||||||
b ppc_exc_interrupt
|
b ppc_exc_interrupt
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
/* Alignment */
|
/* Alignment */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 5
|
li r3, 5
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Program */
|
/* Program */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 6
|
li r3, 6
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
#ifdef __PPC_CPU_E6500__
|
#ifdef __PPC_CPU_E6500__
|
||||||
/* Floating-point unavailable */
|
/* Floating-point unavailable */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 7
|
li r3, 7
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
#endif
|
#endif
|
||||||
/* System call */
|
/* System call */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 8
|
li r3, 8
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
#ifdef __PPC_CPU_E6500__
|
#ifdef __PPC_CPU_E6500__
|
||||||
/* APU unavailable */
|
/* APU unavailable */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 9
|
li r3, 9
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
#endif
|
#endif
|
||||||
/* Decrementer */
|
/* Decrementer */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 10
|
li r3, 10
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Fixed-interval timer interrupt */
|
/* Fixed-interval timer interrupt */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 11
|
li r3, 11
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Watchdog timer interrupt */
|
/* Watchdog timer interrupt */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 12
|
li r3, 12
|
||||||
b ppc_exc_fatal_critical
|
b ppc_exc_fatal_critical
|
||||||
/* Data TLB error */
|
/* Data TLB error */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 13
|
li r3, 13
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Instruction TLB error */
|
/* Instruction TLB error */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 14
|
li r3, 14
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Debug */
|
/* Debug */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 15
|
li r3, 15
|
||||||
b ppc_exc_fatal_debug
|
b ppc_exc_fatal_debug
|
||||||
/* SPE APU unavailable or AltiVec unavailable */
|
/* SPE APU unavailable or AltiVec unavailable */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 32
|
li r3, 32
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* SPE floating-point data exception or AltiVec assist */
|
/* SPE floating-point data exception or AltiVec assist */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 33
|
li r3, 33
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
#ifndef __PPC_CPU_E6500__
|
#ifndef __PPC_CPU_E6500__
|
||||||
/* SPE floating-point round exception */
|
/* SPE floating-point round exception */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 34
|
li r3, 34
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
#endif
|
#endif
|
||||||
/* Performance monitor */
|
/* Performance monitor */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 35
|
li r3, 35
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
#ifdef __PPC_CPU_E6500__
|
#ifdef __PPC_CPU_E6500__
|
||||||
/* Processor doorbell interrupt */
|
/* Processor doorbell interrupt */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 36
|
li r3, 36
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Processor doorbell critical interrupt */
|
/* Processor doorbell critical interrupt */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 37
|
li r3, 37
|
||||||
b ppc_exc_fatal_critical
|
b ppc_exc_fatal_critical
|
||||||
/* Guest processor doorbell */
|
/* Guest processor doorbell */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 38
|
li r3, 38
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Guest processor doorbell critical and machine check */
|
/* Guest processor doorbell critical and machine check */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 39
|
li r3, 39
|
||||||
b ppc_exc_fatal_critical
|
b ppc_exc_fatal_critical
|
||||||
/* Hypervisor system call */
|
/* Hypervisor system call */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 40
|
li r3, 40
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* Hypervisor privilege */
|
/* Hypervisor privilege */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 41
|
li r3, 41
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
/* LRAT error */
|
/* LRAT error */
|
||||||
stwu r1, -EXC_GENERIC_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -EXC_GENERIC_SIZE(r1)
|
||||||
stw r3, GPR3_OFFSET(r1)
|
PPC_REG_STORE r3, GPR3_OFFSET(r1)
|
||||||
li r3, 42
|
li r3, 42
|
||||||
b ppc_exc_fatal_normal
|
b ppc_exc_fatal_normal
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011, 2016 embedded brains GmbH. All rights reserved.
|
* Copyright (c) 2011, 2017 embedded brains GmbH. All rights reserved.
|
||||||
*
|
*
|
||||||
* embedded brains GmbH
|
* embedded brains GmbH
|
||||||
* Dornierstr. 4
|
* Dornierstr. 4
|
||||||
@@ -40,19 +40,9 @@
|
|||||||
#define SCRATCH_3_OFFSET GPR10_OFFSET
|
#define SCRATCH_3_OFFSET GPR10_OFFSET
|
||||||
#define SCRATCH_4_OFFSET GPR11_OFFSET
|
#define SCRATCH_4_OFFSET GPR11_OFFSET
|
||||||
#define SCRATCH_5_OFFSET GPR12_OFFSET
|
#define SCRATCH_5_OFFSET GPR12_OFFSET
|
||||||
|
#define FRAME_OFFSET PPC_EXC_INTERRUPT_FRAME_OFFSET
|
||||||
/*
|
|
||||||
* The register 2 slot is free, since this is the read-only small data anchor.
|
|
||||||
*/
|
|
||||||
#define FRAME_OFFSET GPR2_OFFSET
|
|
||||||
|
|
||||||
#ifdef RTEMS_PROFILING
|
#ifdef RTEMS_PROFILING
|
||||||
/*
|
|
||||||
* The CPU_INTERRUPT_FRAME_SIZE is enough to store this additional register.
|
|
||||||
*/
|
|
||||||
#define ENTRY_INSTANT_REGISTER r15
|
|
||||||
#define ENTRY_INSTANT_OFFSET GPR13_OFFSET
|
|
||||||
|
|
||||||
.macro GET_TIME_BASE REG
|
.macro GET_TIME_BASE REG
|
||||||
#if defined(__PPC_CPU_E6500__)
|
#if defined(__PPC_CPU_E6500__)
|
||||||
mfspr \REG, FSL_EIS_ATBL
|
mfspr \REG, FSL_EIS_ATBL
|
||||||
@@ -88,16 +78,14 @@ ppc_exc_min_prolog_async_tmpl_normal:
|
|||||||
|
|
||||||
ppc_exc_interrupt:
|
ppc_exc_interrupt:
|
||||||
|
|
||||||
#ifdef RTEMS_PROFILING
|
|
||||||
/* Save non-volatile ENTRY_INSTANT_REGISTER */
|
|
||||||
stw ENTRY_INSTANT_REGISTER, ENTRY_INSTANT_OFFSET(r1)
|
|
||||||
|
|
||||||
/* Get entry instant */
|
|
||||||
GET_TIME_BASE ENTRY_INSTANT_REGISTER
|
|
||||||
#endif /* RTEMS_PROFILING */
|
|
||||||
|
|
||||||
/* Save non-volatile FRAME_REGISTER */
|
/* Save non-volatile FRAME_REGISTER */
|
||||||
stw FRAME_REGISTER, FRAME_OFFSET(r1)
|
PPC_REG_STORE FRAME_REGISTER, FRAME_OFFSET(r1)
|
||||||
|
|
||||||
|
#ifdef RTEMS_PROFILING
|
||||||
|
/* Get entry instant */
|
||||||
|
GET_TIME_BASE FRAME_REGISTER
|
||||||
|
stw FRAME_REGISTER, PPC_EXC_INTERRUPT_ENTRY_INSTANT_OFFSET(r1)
|
||||||
|
#endif /* RTEMS_PROFILING */
|
||||||
|
|
||||||
#ifdef __SPE__
|
#ifdef __SPE__
|
||||||
/* Enable SPE */
|
/* Enable SPE */
|
||||||
@@ -162,25 +150,29 @@ ppc_exc_interrupt:
|
|||||||
lwzx HANDLER_REGISTER, HANDLER_REGISTER, SCRATCH_0_REGISTER
|
lwzx HANDLER_REGISTER, HANDLER_REGISTER, SCRATCH_0_REGISTER
|
||||||
#endif /* PPC_EXC_CONFIG_USE_FIXED_HANDLER */
|
#endif /* PPC_EXC_CONFIG_USE_FIXED_HANDLER */
|
||||||
|
|
||||||
|
#ifdef __powerpc64__
|
||||||
|
PPC_GPR_STORE r2, GPR2_OFFSET(r1)
|
||||||
|
LA32 r2, .TOC.
|
||||||
|
#endif
|
||||||
PPC_GPR_STORE SCRATCH_1_REGISTER, SCRATCH_1_OFFSET(r1)
|
PPC_GPR_STORE SCRATCH_1_REGISTER, SCRATCH_1_OFFSET(r1)
|
||||||
PPC_GPR_STORE SCRATCH_2_REGISTER, SCRATCH_2_OFFSET(r1)
|
PPC_GPR_STORE SCRATCH_2_REGISTER, SCRATCH_2_OFFSET(r1)
|
||||||
PPC_GPR_STORE SCRATCH_3_REGISTER, SCRATCH_3_OFFSET(r1)
|
PPC_GPR_STORE SCRATCH_3_REGISTER, SCRATCH_3_OFFSET(r1)
|
||||||
PPC_GPR_STORE SCRATCH_4_REGISTER, SCRATCH_4_OFFSET(r1)
|
PPC_GPR_STORE SCRATCH_4_REGISTER, SCRATCH_4_OFFSET(r1)
|
||||||
PPC_GPR_STORE SCRATCH_5_REGISTER, SCRATCH_5_OFFSET(r1)
|
PPC_GPR_STORE SCRATCH_5_REGISTER, SCRATCH_5_OFFSET(r1)
|
||||||
|
|
||||||
/* Save SRR0, SRR1, CR, CTR, XER, and LR */
|
/* Save SRR0, SRR1, CR, XER, CTR, and LR */
|
||||||
mfsrr0 SCRATCH_0_REGISTER
|
mfsrr0 SCRATCH_0_REGISTER
|
||||||
mfsrr1 SCRATCH_1_REGISTER
|
mfsrr1 SCRATCH_1_REGISTER
|
||||||
mfcr SCRATCH_2_REGISTER
|
mfcr SCRATCH_2_REGISTER
|
||||||
mfctr SCRATCH_3_REGISTER
|
mfxer SCRATCH_3_REGISTER
|
||||||
mfxer SCRATCH_4_REGISTER
|
mfctr SCRATCH_4_REGISTER
|
||||||
mflr SCRATCH_5_REGISTER
|
mflr SCRATCH_5_REGISTER
|
||||||
stw SCRATCH_0_REGISTER, SRR0_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_0_REGISTER, SRR0_FRAME_OFFSET(r1)
|
||||||
stw SCRATCH_1_REGISTER, SRR1_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_1_REGISTER, SRR1_FRAME_OFFSET(r1)
|
||||||
stw SCRATCH_2_REGISTER, EXC_CR_OFFSET(r1)
|
stw SCRATCH_2_REGISTER, EXC_CR_OFFSET(r1)
|
||||||
stw SCRATCH_3_REGISTER, EXC_CTR_OFFSET(r1)
|
stw SCRATCH_3_REGISTER, EXC_XER_OFFSET(r1)
|
||||||
stw SCRATCH_4_REGISTER, EXC_XER_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_4_REGISTER, EXC_CTR_OFFSET(r1)
|
||||||
stw SCRATCH_5_REGISTER, EXC_LR_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_5_REGISTER, EXC_LR_OFFSET(r1)
|
||||||
|
|
||||||
#ifdef __SPE__
|
#ifdef __SPE__
|
||||||
/* Save SPEFSCR and ACC */
|
/* Save SPEFSCR and ACC */
|
||||||
@@ -292,7 +284,7 @@ ppc_exc_interrupt:
|
|||||||
/* Update profiling data if necessary */
|
/* Update profiling data if necessary */
|
||||||
bne cr2, .Lprofiling_done
|
bne cr2, .Lprofiling_done
|
||||||
GET_SELF_CPU_CONTROL r3
|
GET_SELF_CPU_CONTROL r3
|
||||||
mr r4, ENTRY_INSTANT_REGISTER
|
lwz r4, PPC_EXC_INTERRUPT_ENTRY_INSTANT_OFFSET(FRAME_REGISTER)
|
||||||
GET_TIME_BASE r5
|
GET_TIME_BASE r5
|
||||||
bl _Profiling_Outer_most_interrupt_entry_and_exit
|
bl _Profiling_Outer_most_interrupt_entry_and_exit
|
||||||
.Lprofiling_done:
|
.Lprofiling_done:
|
||||||
@@ -310,7 +302,7 @@ ppc_exc_interrupt:
|
|||||||
* on the IRQ stack) and restore FRAME_REGISTER.
|
* on the IRQ stack) and restore FRAME_REGISTER.
|
||||||
*/
|
*/
|
||||||
mr r1, FRAME_REGISTER
|
mr r1, FRAME_REGISTER
|
||||||
lwz FRAME_REGISTER, FRAME_OFFSET(r1)
|
PPC_REG_LOAD FRAME_REGISTER, FRAME_OFFSET(r1)
|
||||||
|
|
||||||
/* Decrement levels and determine thread dispatch state */
|
/* Decrement levels and determine thread dispatch state */
|
||||||
xori SCRATCH_0_REGISTER, SCRATCH_0_REGISTER, 1
|
xori SCRATCH_0_REGISTER, SCRATCH_0_REGISTER, 1
|
||||||
@@ -458,13 +450,13 @@ ppc_exc_interrupt:
|
|||||||
li SCRATCH_0_REGISTER, FRAME_OFFSET
|
li SCRATCH_0_REGISTER, FRAME_OFFSET
|
||||||
stwcx. SCRATCH_0_REGISTER, r1, SCRATCH_0_REGISTER
|
stwcx. SCRATCH_0_REGISTER, r1, SCRATCH_0_REGISTER
|
||||||
|
|
||||||
/* Load SRR0, SRR1, CR, CTR, XER, and LR */
|
/* Load SRR0, SRR1, CR, XER, CTR, and LR */
|
||||||
lwz SCRATCH_0_REGISTER, SRR0_FRAME_OFFSET(r1)
|
PPC_REG_LOAD SCRATCH_0_REGISTER, SRR0_FRAME_OFFSET(r1)
|
||||||
lwz SCRATCH_1_REGISTER, SRR1_FRAME_OFFSET(r1)
|
PPC_REG_LOAD SCRATCH_1_REGISTER, SRR1_FRAME_OFFSET(r1)
|
||||||
lwz SCRATCH_2_REGISTER, EXC_CR_OFFSET(r1)
|
lwz SCRATCH_2_REGISTER, EXC_CR_OFFSET(r1)
|
||||||
lwz SCRATCH_3_REGISTER, EXC_CTR_OFFSET(r1)
|
lwz SCRATCH_3_REGISTER, EXC_XER_OFFSET(r1)
|
||||||
lwz SCRATCH_4_REGISTER, EXC_XER_OFFSET(r1)
|
PPC_REG_LOAD SCRATCH_4_REGISTER, EXC_CTR_OFFSET(r1)
|
||||||
lwz SCRATCH_5_REGISTER, EXC_LR_OFFSET(r1)
|
PPC_REG_LOAD SCRATCH_5_REGISTER, EXC_LR_OFFSET(r1)
|
||||||
|
|
||||||
PPC_GPR_LOAD VECTOR_REGISTER, VECTOR_OFFSET(r1)
|
PPC_GPR_LOAD VECTOR_REGISTER, VECTOR_OFFSET(r1)
|
||||||
PPC_GPR_LOAD SELF_CPU_REGISTER, SELF_CPU_OFFSET(r1)
|
PPC_GPR_LOAD SELF_CPU_REGISTER, SELF_CPU_OFFSET(r1)
|
||||||
@@ -486,21 +478,19 @@ ppc_exc_interrupt:
|
|||||||
mtsrr0 SCRATCH_0_REGISTER
|
mtsrr0 SCRATCH_0_REGISTER
|
||||||
PPC_GPR_LOAD SCRATCH_0_REGISTER, SCRATCH_0_OFFSET(r1)
|
PPC_GPR_LOAD SCRATCH_0_REGISTER, SCRATCH_0_OFFSET(r1)
|
||||||
mtsrr1 SCRATCH_1_REGISTER
|
mtsrr1 SCRATCH_1_REGISTER
|
||||||
|
#ifdef __powerpc64__
|
||||||
|
PPC_GPR_LOAD r2, GPR2_OFFSET(r1)
|
||||||
|
#endif
|
||||||
PPC_GPR_LOAD SCRATCH_1_REGISTER, SCRATCH_1_OFFSET(r1)
|
PPC_GPR_LOAD SCRATCH_1_REGISTER, SCRATCH_1_OFFSET(r1)
|
||||||
mtcr SCRATCH_2_REGISTER
|
mtcr SCRATCH_2_REGISTER
|
||||||
PPC_GPR_LOAD SCRATCH_2_REGISTER, SCRATCH_2_OFFSET(r1)
|
PPC_GPR_LOAD SCRATCH_2_REGISTER, SCRATCH_2_OFFSET(r1)
|
||||||
mtctr SCRATCH_3_REGISTER
|
mtxer SCRATCH_3_REGISTER
|
||||||
PPC_GPR_LOAD SCRATCH_3_REGISTER, SCRATCH_3_OFFSET(r1)
|
PPC_GPR_LOAD SCRATCH_3_REGISTER, SCRATCH_3_OFFSET(r1)
|
||||||
mtxer SCRATCH_4_REGISTER
|
mtctr SCRATCH_4_REGISTER
|
||||||
PPC_GPR_LOAD SCRATCH_4_REGISTER, SCRATCH_4_OFFSET(r1)
|
PPC_GPR_LOAD SCRATCH_4_REGISTER, SCRATCH_4_OFFSET(r1)
|
||||||
mtlr SCRATCH_5_REGISTER
|
mtlr SCRATCH_5_REGISTER
|
||||||
PPC_GPR_LOAD SCRATCH_5_REGISTER, SCRATCH_5_OFFSET(r1)
|
PPC_GPR_LOAD SCRATCH_5_REGISTER, SCRATCH_5_OFFSET(r1)
|
||||||
|
|
||||||
#ifdef RTEMS_PROFILING
|
|
||||||
/* Restore ENTRY_INSTANT_REGISTER */
|
|
||||||
lwz ENTRY_INSTANT_REGISTER, ENTRY_INSTANT_OFFSET(r1)
|
|
||||||
#endif /* RTEMS_PROFILING */
|
|
||||||
|
|
||||||
/* Pop stack */
|
/* Pop stack */
|
||||||
addi r1, r1, PPC_EXC_INTERRUPT_FRAME_SIZE
|
addi r1, r1, PPC_EXC_INTERRUPT_FRAME_SIZE
|
||||||
|
|
||||||
|
|||||||
@@ -26,80 +26,80 @@
|
|||||||
|
|
||||||
ppc_exc_fatal_critical:
|
ppc_exc_fatal_critical:
|
||||||
|
|
||||||
stw SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
|
||||||
mfcsrr0 SCRATCH_REGISTER_1
|
mfcsrr0 SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
|
||||||
mfcsrr1 SCRATCH_REGISTER_1
|
mfcsrr1 SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
|
||||||
b .Lppc_exc_fatal
|
b .Lppc_exc_fatal
|
||||||
|
|
||||||
ppc_exc_fatal_machine_check:
|
ppc_exc_fatal_machine_check:
|
||||||
|
|
||||||
stw SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
|
||||||
mfmcsrr0 SCRATCH_REGISTER_1
|
mfmcsrr0 SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
|
||||||
mfmcsrr1 SCRATCH_REGISTER_1
|
mfmcsrr1 SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
|
||||||
b .Lppc_exc_fatal
|
b .Lppc_exc_fatal
|
||||||
|
|
||||||
ppc_exc_fatal_debug:
|
ppc_exc_fatal_debug:
|
||||||
|
|
||||||
stw SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
|
||||||
mfspr SCRATCH_REGISTER_1, BOOKE_DSRR0
|
mfspr SCRATCH_REGISTER_1, BOOKE_DSRR0
|
||||||
stw SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
|
||||||
mfspr SCRATCH_REGISTER_1, BOOKE_DSRR1
|
mfspr SCRATCH_REGISTER_1, BOOKE_DSRR1
|
||||||
stw SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
|
||||||
b .Lppc_exc_fatal
|
b .Lppc_exc_fatal
|
||||||
|
|
||||||
ppc_exc_fatal_normal:
|
ppc_exc_fatal_normal:
|
||||||
|
|
||||||
stw SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
|
||||||
mfsrr0 SCRATCH_REGISTER_1
|
mfsrr0 SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
|
||||||
mfsrr1 SCRATCH_REGISTER_1
|
mfsrr1 SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
|
||||||
|
|
||||||
.Lppc_exc_fatal:
|
.Lppc_exc_fatal:
|
||||||
|
|
||||||
stw r3, EXCEPTION_NUMBER_OFFSET(r1)
|
stw r3, EXCEPTION_NUMBER_OFFSET(r1)
|
||||||
mfcr SCRATCH_REGISTER_1
|
mfcr SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, EXC_CR_OFFSET(r1)
|
stw SCRATCH_REGISTER_1, EXC_CR_OFFSET(r1)
|
||||||
mfctr SCRATCH_REGISTER_1
|
|
||||||
stw SCRATCH_REGISTER_1, EXC_CTR_OFFSET(r1)
|
|
||||||
mfxer SCRATCH_REGISTER_1
|
mfxer SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, EXC_XER_OFFSET(r1)
|
stw SCRATCH_REGISTER_1, EXC_XER_OFFSET(r1)
|
||||||
|
mfctr SCRATCH_REGISTER_1
|
||||||
|
PPC_REG_STORE SCRATCH_REGISTER_1, EXC_CTR_OFFSET(r1)
|
||||||
mflr SCRATCH_REGISTER_1
|
mflr SCRATCH_REGISTER_1
|
||||||
stw SCRATCH_REGISTER_1, EXC_LR_OFFSET(r1)
|
PPC_REG_STORE SCRATCH_REGISTER_1, EXC_LR_OFFSET(r1)
|
||||||
stw r0, GPR0_OFFSET(r1)
|
PPC_REG_STORE r0, GPR0_OFFSET(r1)
|
||||||
stw r1, GPR1_OFFSET(r1)
|
PPC_REG_STORE r1, GPR1_OFFSET(r1)
|
||||||
stw r2, GPR2_OFFSET(r1)
|
PPC_REG_STORE r2, GPR2_OFFSET(r1)
|
||||||
stw r5, GPR5_OFFSET(r1)
|
PPC_REG_STORE r5, GPR5_OFFSET(r1)
|
||||||
stw r6, GPR6_OFFSET(r1)
|
PPC_REG_STORE r6, GPR6_OFFSET(r1)
|
||||||
stw r7, GPR7_OFFSET(r1)
|
PPC_REG_STORE r7, GPR7_OFFSET(r1)
|
||||||
stw r8, GPR8_OFFSET(r1)
|
PPC_REG_STORE r8, GPR8_OFFSET(r1)
|
||||||
stw r9, GPR9_OFFSET(r1)
|
PPC_REG_STORE r9, GPR9_OFFSET(r1)
|
||||||
stw r10, GPR10_OFFSET(r1)
|
PPC_REG_STORE r10, GPR10_OFFSET(r1)
|
||||||
stw r11, GPR11_OFFSET(r1)
|
PPC_REG_STORE r11, GPR11_OFFSET(r1)
|
||||||
stw r12, GPR12_OFFSET(r1)
|
PPC_REG_STORE r12, GPR12_OFFSET(r1)
|
||||||
stw r13, GPR13_OFFSET(r1)
|
PPC_REG_STORE r13, GPR13_OFFSET(r1)
|
||||||
stw r14, GPR14_OFFSET(r1)
|
PPC_REG_STORE r14, GPR14_OFFSET(r1)
|
||||||
stw r15, GPR15_OFFSET(r1)
|
PPC_REG_STORE r15, GPR15_OFFSET(r1)
|
||||||
stw r16, GPR16_OFFSET(r1)
|
PPC_REG_STORE r16, GPR16_OFFSET(r1)
|
||||||
stw r17, GPR17_OFFSET(r1)
|
PPC_REG_STORE r17, GPR17_OFFSET(r1)
|
||||||
stw r18, GPR18_OFFSET(r1)
|
PPC_REG_STORE r18, GPR18_OFFSET(r1)
|
||||||
stw r19, GPR19_OFFSET(r1)
|
PPC_REG_STORE r19, GPR19_OFFSET(r1)
|
||||||
stw r20, GPR20_OFFSET(r1)
|
PPC_REG_STORE r20, GPR20_OFFSET(r1)
|
||||||
stw r21, GPR21_OFFSET(r1)
|
PPC_REG_STORE r21, GPR21_OFFSET(r1)
|
||||||
stw r22, GPR22_OFFSET(r1)
|
PPC_REG_STORE r22, GPR22_OFFSET(r1)
|
||||||
stw r23, GPR23_OFFSET(r1)
|
PPC_REG_STORE r23, GPR23_OFFSET(r1)
|
||||||
stw r24, GPR24_OFFSET(r1)
|
PPC_REG_STORE r24, GPR24_OFFSET(r1)
|
||||||
stw r25, GPR25_OFFSET(r1)
|
PPC_REG_STORE r25, GPR25_OFFSET(r1)
|
||||||
stw r26, GPR26_OFFSET(r1)
|
PPC_REG_STORE r26, GPR26_OFFSET(r1)
|
||||||
stw r27, GPR27_OFFSET(r1)
|
PPC_REG_STORE r27, GPR27_OFFSET(r1)
|
||||||
stw r28, GPR28_OFFSET(r1)
|
PPC_REG_STORE r28, GPR28_OFFSET(r1)
|
||||||
stw r29, GPR29_OFFSET(r1)
|
PPC_REG_STORE r29, GPR29_OFFSET(r1)
|
||||||
stw r30, GPR30_OFFSET(r1)
|
PPC_REG_STORE r30, GPR30_OFFSET(r1)
|
||||||
stw r31, GPR31_OFFSET(r1)
|
PPC_REG_STORE r31, GPR31_OFFSET(r1)
|
||||||
|
|
||||||
/* Enable FPU and/or AltiVec */
|
/* Enable FPU and/or AltiVec */
|
||||||
#if defined(PPC_MULTILIB_FPU) || defined(PPC_MULTILIB_ALTIVEC)
|
#if defined(PPC_MULTILIB_FPU) || defined(PPC_MULTILIB_ALTIVEC)
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ void BSP_printStackTrace(const BSP_Exception_frame *excPtr)
|
|||||||
|
|
||||||
printk("Stack Trace: \n ");
|
printk("Stack Trace: \n ");
|
||||||
if (excPtr) {
|
if (excPtr) {
|
||||||
printk("IP: 0x%08" PRIu32 ", ", excPtr->EXC_SRR0);
|
printk("IP: 0x%08" PRIxPTR ", ", excPtr->EXC_SRR0);
|
||||||
sp = (LRFrame) GET_GPR(excPtr->GPR1);
|
sp = (LRFrame) GET_GPR(excPtr->GPR1);
|
||||||
lr = (void *) excPtr->EXC_LR;
|
lr = (void *) excPtr->EXC_LR;
|
||||||
} else {
|
} else {
|
||||||
@@ -75,9 +75,9 @@ void BSP_printStackTrace(const BSP_Exception_frame *excPtr)
|
|||||||
__asm__ __volatile__("mr %0, 1":"=r"(sp));
|
__asm__ __volatile__("mr %0, 1":"=r"(sp));
|
||||||
lr = (LRFrame) ppc_link_register();
|
lr = (LRFrame) ppc_link_register();
|
||||||
}
|
}
|
||||||
printk("LR: 0x%08" PRIuPTR "\n", (uintptr_t) lr);
|
printk("LR: 0x%08" PRIxPTR "\n", (uintptr_t) lr);
|
||||||
for (f = (LRFrame) sp, i = 0; f->frameLink && i < STACK_CLAMP; f = f->frameLink) {
|
for (f = (LRFrame) sp, i = 0; f->frameLink && i < STACK_CLAMP; f = f->frameLink) {
|
||||||
printk("--^ 0x%08" PRIuPTR "", (uintptr_t) (f->frameLink->lr));
|
printk("--^ 0x%08" PRIxPTR "", (uintptr_t) (f->frameLink->lr));
|
||||||
if (!(++i % 5))
|
if (!(++i % 5))
|
||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
@@ -96,8 +96,8 @@ void _CPU_Exception_frame_print(const CPU_Exception_frame *excPtr)
|
|||||||
unsigned n = excPtr->_EXC_number & 0x7fff;
|
unsigned n = excPtr->_EXC_number & 0x7fff;
|
||||||
|
|
||||||
printk("exception vector %d (0x%x)\n", n, n);
|
printk("exception vector %d (0x%x)\n", n, n);
|
||||||
printk(" next PC or address of fault = 0x%08" PRIx32 "\n", excPtr->EXC_SRR0);
|
printk(" next PC or address of fault = 0x%08" PRIxPTR "\n", excPtr->EXC_SRR0);
|
||||||
printk(" saved MSR = 0x%08" PRIx32 "\n", excPtr->EXC_SRR1);
|
printk(" saved MSR = 0x%08" PRIxPTR "\n", excPtr->EXC_SRR1);
|
||||||
|
|
||||||
/* Try to find out more about the context where this happened */
|
/* Try to find out more about the context where this happened */
|
||||||
printk(
|
printk(
|
||||||
@@ -112,51 +112,51 @@ void _CPU_Exception_frame_print(const CPU_Exception_frame *excPtr)
|
|||||||
|
|
||||||
/* Dump registers */
|
/* Dump registers */
|
||||||
|
|
||||||
printk(" R0 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR0));
|
printk(" R0 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR0));
|
||||||
if (synch) {
|
if (synch) {
|
||||||
printk(" R1 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR1));
|
printk(" R1 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR1));
|
||||||
printk(" R2 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR2));
|
printk(" R2 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR2));
|
||||||
} else {
|
} else {
|
||||||
printk(" ");
|
printk(" ");
|
||||||
printk(" ");
|
printk(" ");
|
||||||
}
|
}
|
||||||
printk(" R3 = 0x%08" PRIx32 "\n", GET_GPR(excPtr->GPR3));
|
printk(" R3 = 0x%08" PRIxPTR "\n", GET_GPR(excPtr->GPR3));
|
||||||
printk(" R4 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR4));
|
printk(" R4 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR4));
|
||||||
printk(" R5 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR5));
|
printk(" R5 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR5));
|
||||||
printk(" R6 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR6));
|
printk(" R6 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR6));
|
||||||
printk(" R7 = 0x%08" PRIx32 "\n", GET_GPR(excPtr->GPR7));
|
printk(" R7 = 0x%08" PRIxPTR "\n", GET_GPR(excPtr->GPR7));
|
||||||
printk(" R8 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR8));
|
printk(" R8 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR8));
|
||||||
printk(" R9 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR9));
|
printk(" R9 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR9));
|
||||||
printk(" R10 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR10));
|
printk(" R10 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR10));
|
||||||
printk(" R11 = 0x%08" PRIx32 "\n", GET_GPR(excPtr->GPR11));
|
printk(" R11 = 0x%08" PRIxPTR "\n", GET_GPR(excPtr->GPR11));
|
||||||
printk(" R12 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR12));
|
printk(" R12 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR12));
|
||||||
if (synch) {
|
if (synch) {
|
||||||
printk(" R13 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR13));
|
printk(" R13 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR13));
|
||||||
printk(" R14 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR14));
|
printk(" R14 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR14));
|
||||||
printk(" R15 = 0x%08" PRIx32 "\n", GET_GPR(excPtr->GPR15));
|
printk(" R15 = 0x%08" PRIxPTR "\n", GET_GPR(excPtr->GPR15));
|
||||||
printk(" R16 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR16));
|
printk(" R16 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR16));
|
||||||
printk(" R17 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR17));
|
printk(" R17 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR17));
|
||||||
printk(" R18 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR18));
|
printk(" R18 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR18));
|
||||||
printk(" R19 = 0x%08" PRIx32 "\n", GET_GPR(excPtr->GPR19));
|
printk(" R19 = 0x%08" PRIxPTR "\n", GET_GPR(excPtr->GPR19));
|
||||||
printk(" R20 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR20));
|
printk(" R20 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR20));
|
||||||
printk(" R21 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR21));
|
printk(" R21 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR21));
|
||||||
printk(" R22 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR22));
|
printk(" R22 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR22));
|
||||||
printk(" R23 = 0x%08" PRIx32 "\n", GET_GPR(excPtr->GPR23));
|
printk(" R23 = 0x%08" PRIxPTR "\n", GET_GPR(excPtr->GPR23));
|
||||||
printk(" R24 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR24));
|
printk(" R24 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR24));
|
||||||
printk(" R25 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR25));
|
printk(" R25 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR25));
|
||||||
printk(" R26 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR26));
|
printk(" R26 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR26));
|
||||||
printk(" R27 = 0x%08" PRIx32 "\n", GET_GPR(excPtr->GPR27));
|
printk(" R27 = 0x%08" PRIxPTR "\n", GET_GPR(excPtr->GPR27));
|
||||||
printk(" R28 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR28));
|
printk(" R28 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR28));
|
||||||
printk(" R29 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR29));
|
printk(" R29 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR29));
|
||||||
printk(" R30 = 0x%08" PRIx32 "", GET_GPR(excPtr->GPR30));
|
printk(" R30 = 0x%08" PRIxPTR "", GET_GPR(excPtr->GPR30));
|
||||||
printk(" R31 = 0x%08" PRIx32 "\n", GET_GPR(excPtr->GPR31));
|
printk(" R31 = 0x%08" PRIxPTR "\n", GET_GPR(excPtr->GPR31));
|
||||||
} else {
|
} else {
|
||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
printk(" CR = 0x%08" PRIx32 "\n", excPtr->EXC_CR);
|
printk(" CR = 0x%08" PRIx32 "\n", excPtr->EXC_CR);
|
||||||
printk(" CTR = 0x%08" PRIx32 "\n", excPtr->EXC_CTR);
|
printk(" CTR = 0x%08" PRIxPTR "\n", excPtr->EXC_CTR);
|
||||||
printk(" XER = 0x%08" PRIx32 "\n", excPtr->EXC_XER);
|
printk(" XER = 0x%08" PRIx32 "\n", excPtr->EXC_XER);
|
||||||
printk(" LR = 0x%08" PRIx32 "\n", excPtr->EXC_LR);
|
printk(" LR = 0x%08" PRIxPTR "\n", excPtr->EXC_LR);
|
||||||
|
|
||||||
/* Would be great to print DAR but unfortunately,
|
/* Would be great to print DAR but unfortunately,
|
||||||
* that is not portable across different CPUs.
|
* that is not portable across different CPUs.
|
||||||
@@ -206,13 +206,13 @@ void _CPU_Exception_frame_print(const CPU_Exception_frame *excPtr)
|
|||||||
|
|
||||||
#ifdef PPC_MULTILIB_FPU
|
#ifdef PPC_MULTILIB_FPU
|
||||||
{
|
{
|
||||||
unsigned long long *f = (unsigned long long *) &excPtr->F0;
|
uint64_t *f = (uint64_t *) &excPtr->F0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printk("FPSCR = 0x%08llx\n", excPtr->FPSCR);
|
printk("FPSCR = 0x%08" PRIu64 "\n", excPtr->FPSCR);
|
||||||
|
|
||||||
for (i = 0; i < 32; ++i) {
|
for (i = 0; i < 32; ++i) {
|
||||||
printk(" F%02i = 0x%016llx\n", i, f[i]);
|
printk(" F%02i = 0x%016" PRIu64 "\n", i, f[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define LINK_REGISTER_CALLEE_UPDATE_ROOM 4
|
#define LINK_REGISTER_CALLEE_UPDATE_ROOM 4
|
||||||
|
|
||||||
#define EXC_GENERIC_SIZE PPC_EXC_FRAME_SIZE
|
#define EXC_GENERIC_SIZE (PPC_EXC_FRAME_SIZE + PPC_STACK_RED_ZONE_SIZE)
|
||||||
|
|
||||||
#define PPC_EXC_INTERRUPT_FRAME_SIZE CPU_INTERRUPT_FRAME_SIZE
|
#define PPC_EXC_INTERRUPT_FRAME_SIZE CPU_INTERRUPT_FRAME_SIZE
|
||||||
|
|
||||||
|
|||||||
@@ -129,10 +129,6 @@ void _CPU_Context_Initialize(
|
|||||||
if ( tls_area != NULL ) {
|
if ( tls_area != NULL ) {
|
||||||
void *tls_block = _TLS_TCB_before_TLS_block_initialize( tls_area );
|
void *tls_block = _TLS_TCB_before_TLS_block_initialize( tls_area );
|
||||||
|
|
||||||
the_ppc_context->gpr2 = (uint32_t) tls_block + 0x7000;
|
the_ppc_context->tp = (uintptr_t) tls_block + 0x7000;
|
||||||
} else {
|
|
||||||
register uint32_t gpr2 __asm__("2");
|
|
||||||
|
|
||||||
the_ppc_context->gpr2 = gpr2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
* COPYRIGHT (c) 1989-1997.
|
* COPYRIGHT (c) 1989-1997.
|
||||||
* On-Line Applications Research Corporation (OAR).
|
* On-Line Applications Research Corporation (OAR).
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011, 2016 embedded brains GmbH
|
* Copyright (c) 2011, 2017 embedded brains GmbH
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may in
|
* The license and distribution terms for this file may in
|
||||||
* the file LICENSE in this distribution or at
|
* the file LICENSE in this distribution or at
|
||||||
@@ -267,8 +267,8 @@ PROC (_CPU_Context_switch):
|
|||||||
|
|
||||||
GET_SELF_CPU_CONTROL r12
|
GET_SELF_CPU_CONTROL r12
|
||||||
mfmsr r6
|
mfmsr r6
|
||||||
mflr r7
|
mfcr r7
|
||||||
mfcr r8
|
mflr r8
|
||||||
lwz r11, PER_CPU_ISR_DISPATCH_DISABLE(r12)
|
lwz r11, PER_CPU_ISR_DISPATCH_DISABLE(r12)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -287,10 +287,11 @@ PROC (_CPU_Context_switch):
|
|||||||
stwcx. r1, r3, r10
|
stwcx. r1, r3, r10
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
stw r1, PPC_CONTEXT_OFFSET_GPR1(r3)
|
|
||||||
stw r6, PPC_CONTEXT_OFFSET_MSR(r3)
|
stw r6, PPC_CONTEXT_OFFSET_MSR(r3)
|
||||||
stw r7, PPC_CONTEXT_OFFSET_LR(r3)
|
stw r7, PPC_CONTEXT_OFFSET_CR(r3)
|
||||||
stw r8, PPC_CONTEXT_OFFSET_CR(r3)
|
PPC_REG_STORE r1, PPC_CONTEXT_OFFSET_GPR1(r3)
|
||||||
|
PPC_REG_STORE r8, PPC_CONTEXT_OFFSET_LR(r3)
|
||||||
|
|
||||||
PPC_GPR_STORE r14, PPC_CONTEXT_OFFSET_GPR14(r3)
|
PPC_GPR_STORE r14, PPC_CONTEXT_OFFSET_GPR14(r3)
|
||||||
PPC_GPR_STORE r15, PPC_CONTEXT_OFFSET_GPR15(r3)
|
PPC_GPR_STORE r15, PPC_CONTEXT_OFFSET_GPR15(r3)
|
||||||
|
|
||||||
@@ -439,10 +440,10 @@ restore_context:
|
|||||||
bl _CPU_Context_switch_altivec
|
bl _CPU_Context_switch_altivec
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
lwz r1, PPC_CONTEXT_OFFSET_GPR1(r5)
|
|
||||||
lwz r6, PPC_CONTEXT_OFFSET_MSR(r5)
|
lwz r6, PPC_CONTEXT_OFFSET_MSR(r5)
|
||||||
lwz r7, PPC_CONTEXT_OFFSET_LR(r5)
|
lwz r7, PPC_CONTEXT_OFFSET_CR(r5)
|
||||||
lwz r8, PPC_CONTEXT_OFFSET_CR(r5)
|
PPC_REG_LOAD r1, PPC_CONTEXT_OFFSET_GPR1(r5)
|
||||||
|
PPC_REG_LOAD r8, PPC_CONTEXT_OFFSET_LR(r5)
|
||||||
|
|
||||||
PPC_GPR_LOAD r14, PPC_CONTEXT_OFFSET_GPR14(r5)
|
PPC_GPR_LOAD r14, PPC_CONTEXT_OFFSET_GPR14(r5)
|
||||||
PPC_GPR_LOAD r15, PPC_CONTEXT_OFFSET_GPR15(r5)
|
PPC_GPR_LOAD r15, PPC_CONTEXT_OFFSET_GPR15(r5)
|
||||||
@@ -469,7 +470,11 @@ restore_context:
|
|||||||
PPC_GPR_LOAD r30, PPC_CONTEXT_OFFSET_GPR30(r5)
|
PPC_GPR_LOAD r30, PPC_CONTEXT_OFFSET_GPR30(r5)
|
||||||
PPC_GPR_LOAD r31, PPC_CONTEXT_OFFSET_GPR31(r5)
|
PPC_GPR_LOAD r31, PPC_CONTEXT_OFFSET_GPR31(r5)
|
||||||
|
|
||||||
lwz r2, PPC_CONTEXT_OFFSET_GPR2(r5)
|
#ifdef __powerpc64__
|
||||||
|
ld r13, PPC_CONTEXT_OFFSET_TP(r5)
|
||||||
|
#else
|
||||||
|
lwz r2, PPC_CONTEXT_OFFSET_TP(r5)
|
||||||
|
#endif
|
||||||
lwz r11, PPC_CONTEXT_OFFSET_ISR_DISPATCH_DISABLE(r5)
|
lwz r11, PPC_CONTEXT_OFFSET_ISR_DISPATCH_DISABLE(r5)
|
||||||
|
|
||||||
#ifdef PPC_MULTILIB_ALTIVEC
|
#ifdef PPC_MULTILIB_ALTIVEC
|
||||||
@@ -522,8 +527,8 @@ restore_context:
|
|||||||
lfd f31, PPC_CONTEXT_OFFSET_F31(r5)
|
lfd f31, PPC_CONTEXT_OFFSET_F31(r5)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mtcr r8
|
mtlr r8
|
||||||
mtlr r7
|
mtcr r7
|
||||||
mtmsr r6
|
mtmsr r6
|
||||||
stw r11, PER_CPU_ISR_DISPATCH_DISABLE(r12)
|
stw r11, PER_CPU_ISR_DISPATCH_DISABLE(r12)
|
||||||
|
|
||||||
@@ -552,14 +557,14 @@ PROC (_CPU_Context_restore):
|
|||||||
/* We may have a new heir */
|
/* We may have a new heir */
|
||||||
|
|
||||||
/* Read the executing and heir */
|
/* Read the executing and heir */
|
||||||
lwz r7, PER_CPU_OFFSET_EXECUTING(r12)
|
PPC_REG_LOAD r7, PER_CPU_OFFSET_EXECUTING(r12)
|
||||||
lwz r8, PER_CPU_OFFSET_HEIR(r12)
|
PPC_REG_LOAD r8, PER_CPU_OFFSET_HEIR(r12)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the executing only if necessary to avoid cache line
|
* Update the executing only if necessary to avoid cache line
|
||||||
* monopolization.
|
* monopolization.
|
||||||
*/
|
*/
|
||||||
cmpw r7, r8
|
PPC_REG_CMP r7, r8
|
||||||
beq .Lcheck_is_executing
|
beq .Lcheck_is_executing
|
||||||
|
|
||||||
/* Calculate the heir context pointer */
|
/* Calculate the heir context pointer */
|
||||||
@@ -568,7 +573,7 @@ PROC (_CPU_Context_restore):
|
|||||||
clrrwi r5, r4, PPC_DEFAULT_CACHE_LINE_POWER
|
clrrwi r5, r4, PPC_DEFAULT_CACHE_LINE_POWER
|
||||||
|
|
||||||
/* Update the executing */
|
/* Update the executing */
|
||||||
stw r8, PER_CPU_OFFSET_EXECUTING(r12)
|
PPC_REG_STORE r8, PER_CPU_OFFSET_EXECUTING(r12)
|
||||||
|
|
||||||
b .Lcheck_is_executing
|
b .Lcheck_is_executing
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -873,6 +873,11 @@ void ShowBATS(void);
|
|||||||
ori \reg, \reg, (\addr)@l
|
ori \reg, \reg, (\addr)@l
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro LA32 reg, addr
|
||||||
|
lis \reg, (\addr)@h
|
||||||
|
ori \reg, \reg, (\addr)@l
|
||||||
|
.endm
|
||||||
|
|
||||||
.macro LWI reg, value
|
.macro LWI reg, value
|
||||||
lis \reg, (\value)@h
|
lis \reg, (\value)@h
|
||||||
ori \reg, \reg, (\value)@l
|
ori \reg, \reg, (\value)@l
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2009, 2016 embedded brains GmbH.
|
* Copyright (C) 2009, 2017 embedded brains GmbH.
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
* found in the file LICENSE in this distribution or at
|
* found in the file LICENSE in this distribution or at
|
||||||
@@ -52,7 +52,7 @@ PPC_ASSERT_OFFSET(gpr28, GPR28);
|
|||||||
PPC_ASSERT_OFFSET(gpr29, GPR29);
|
PPC_ASSERT_OFFSET(gpr29, GPR29);
|
||||||
PPC_ASSERT_OFFSET(gpr30, GPR30);
|
PPC_ASSERT_OFFSET(gpr30, GPR30);
|
||||||
PPC_ASSERT_OFFSET(gpr31, GPR31);
|
PPC_ASSERT_OFFSET(gpr31, GPR31);
|
||||||
PPC_ASSERT_OFFSET(gpr2, GPR2);
|
PPC_ASSERT_OFFSET(tp, TP);
|
||||||
PPC_ASSERT_OFFSET(isr_dispatch_disable, ISR_DISPATCH_DISABLE);
|
PPC_ASSERT_OFFSET(isr_dispatch_disable, ISR_DISPATCH_DISABLE);
|
||||||
|
|
||||||
#ifdef RTEMS_SMP
|
#ifdef RTEMS_SMP
|
||||||
@@ -169,10 +169,15 @@ PPC_EXC_ASSERT_CANONIC_OFFSET(GPR31);
|
|||||||
|
|
||||||
PPC_EXC_MIN_ASSERT_OFFSET(EXC_SRR0, SRR0_FRAME_OFFSET);
|
PPC_EXC_MIN_ASSERT_OFFSET(EXC_SRR0, SRR0_FRAME_OFFSET);
|
||||||
PPC_EXC_MIN_ASSERT_OFFSET(EXC_SRR1, SRR1_FRAME_OFFSET);
|
PPC_EXC_MIN_ASSERT_OFFSET(EXC_SRR1, SRR1_FRAME_OFFSET);
|
||||||
|
PPC_EXC_MIN_ASSERT_OFFSET(
|
||||||
|
EXC_INTERRUPT_ENTRY_INSTANT,
|
||||||
|
PPC_EXC_INTERRUPT_ENTRY_INSTANT_OFFSET
|
||||||
|
);
|
||||||
PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_CR);
|
PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_CR);
|
||||||
PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_CTR);
|
PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_CTR);
|
||||||
PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_XER);
|
PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_XER);
|
||||||
PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_LR);
|
PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_LR);
|
||||||
|
PPC_EXC_MIN_ASSERT_OFFSET(EXC_INTERRUPT_FRAME, PPC_EXC_INTERRUPT_FRAME_OFFSET);
|
||||||
#ifdef __SPE__
|
#ifdef __SPE__
|
||||||
PPC_EXC_MIN_ASSERT_OFFSET(EXC_SPEFSCR, PPC_EXC_SPEFSCR_OFFSET);
|
PPC_EXC_MIN_ASSERT_OFFSET(EXC_SPEFSCR, PPC_EXC_SPEFSCR_OFFSET);
|
||||||
PPC_EXC_MIN_ASSERT_OFFSET(EXC_ACC, PPC_EXC_ACC_OFFSET);
|
PPC_EXC_MIN_ASSERT_OFFSET(EXC_ACC, PPC_EXC_ACC_OFFSET);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2015 embedded brains GmbH. All rights reserved.
|
* Copyright (c) 2013, 2017 embedded brains GmbH. All rights reserved.
|
||||||
*
|
*
|
||||||
* embedded brains GmbH
|
* embedded brains GmbH
|
||||||
* Dornierstr. 4
|
* Dornierstr. 4
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
#include <rtems/score/cpu.h>
|
#include <rtems/score/cpu.h>
|
||||||
|
|
||||||
#define LR_OFFSET 8
|
#define LR_OFFSET 8
|
||||||
#define CR_OFFSET 12
|
#define CR_OFFSET 16
|
||||||
#define OFFSET(i) ((i) * PPC_GPR_SIZE + 16)
|
#define OFFSET(i) ((i) * PPC_GPR_SIZE + 32)
|
||||||
#define GPR14_OFFSET OFFSET(0)
|
#define GPR14_OFFSET OFFSET(0)
|
||||||
#define GPR15_OFFSET OFFSET(1)
|
#define GPR15_OFFSET OFFSET(1)
|
||||||
#define GPR16_OFFSET OFFSET(2)
|
#define GPR16_OFFSET OFFSET(2)
|
||||||
@@ -100,29 +100,29 @@
|
|||||||
_CPU_Context_validate:
|
_CPU_Context_validate:
|
||||||
|
|
||||||
/* Save */
|
/* Save */
|
||||||
stwu r1, -FRAME_SIZE(r1)
|
PPC_REG_STORE_UPDATE r1, -FRAME_SIZE(r1)
|
||||||
mflr r4
|
mflr r4
|
||||||
stw r4, LR_OFFSET(r1)
|
PPC_REG_STORE r4, LR_OFFSET(r1)
|
||||||
mfcr r4
|
mfcr r4
|
||||||
stw r4, CR_OFFSET(r1)
|
stw r4, CR_OFFSET(r1)
|
||||||
stw r14, GPR14_OFFSET(r1)
|
PPC_REG_STORE r14, GPR14_OFFSET(r1)
|
||||||
stw r15, GPR15_OFFSET(r1)
|
PPC_REG_STORE r15, GPR15_OFFSET(r1)
|
||||||
stw r16, GPR16_OFFSET(r1)
|
PPC_REG_STORE r16, GPR16_OFFSET(r1)
|
||||||
stw r17, GPR17_OFFSET(r1)
|
PPC_REG_STORE r17, GPR17_OFFSET(r1)
|
||||||
stw r18, GPR18_OFFSET(r1)
|
PPC_REG_STORE r18, GPR18_OFFSET(r1)
|
||||||
stw r19, GPR19_OFFSET(r1)
|
PPC_REG_STORE r19, GPR19_OFFSET(r1)
|
||||||
stw r20, GPR20_OFFSET(r1)
|
PPC_REG_STORE r20, GPR20_OFFSET(r1)
|
||||||
stw r21, GPR21_OFFSET(r1)
|
PPC_REG_STORE r21, GPR21_OFFSET(r1)
|
||||||
stw r22, GPR22_OFFSET(r1)
|
PPC_REG_STORE r22, GPR22_OFFSET(r1)
|
||||||
stw r23, GPR23_OFFSET(r1)
|
PPC_REG_STORE r23, GPR23_OFFSET(r1)
|
||||||
stw r24, GPR24_OFFSET(r1)
|
PPC_REG_STORE r24, GPR24_OFFSET(r1)
|
||||||
stw r25, GPR25_OFFSET(r1)
|
PPC_REG_STORE r25, GPR25_OFFSET(r1)
|
||||||
stw r26, GPR26_OFFSET(r1)
|
PPC_REG_STORE r26, GPR26_OFFSET(r1)
|
||||||
stw r27, GPR27_OFFSET(r1)
|
PPC_REG_STORE r27, GPR27_OFFSET(r1)
|
||||||
stw r28, GPR28_OFFSET(r1)
|
PPC_REG_STORE r28, GPR28_OFFSET(r1)
|
||||||
stw r29, GPR29_OFFSET(r1)
|
PPC_REG_STORE r29, GPR29_OFFSET(r1)
|
||||||
stw r30, GPR30_OFFSET(r1)
|
PPC_REG_STORE r30, GPR30_OFFSET(r1)
|
||||||
stw r31, GPR31_OFFSET(r1)
|
PPC_REG_STORE r31, GPR31_OFFSET(r1)
|
||||||
|
|
||||||
#ifdef PPC_MULTILIB_FPU
|
#ifdef PPC_MULTILIB_FPU
|
||||||
stfd f14, F14_OFFSET(r1)
|
stfd f14, F14_OFFSET(r1)
|
||||||
@@ -218,8 +218,12 @@ _CPU_Context_validate:
|
|||||||
addi r26, r3, 21
|
addi r26, r3, 21
|
||||||
addi r27, r3, 22
|
addi r27, r3, 22
|
||||||
|
|
||||||
/* GPR28 contains the GPR2 pattern */
|
/* GPR28 contains the TP pattern */
|
||||||
|
#ifdef __powerpc64__
|
||||||
|
xor r28, r13, r3
|
||||||
|
#else
|
||||||
xor r28, r2, r3
|
xor r28, r2, r3
|
||||||
|
#endif
|
||||||
|
|
||||||
/* GPR29 and CR are equal most of the time */
|
/* GPR29 and CR are equal most of the time */
|
||||||
addi r29, r3, 24
|
addi r29, r3, 24
|
||||||
@@ -330,101 +334,114 @@ check:
|
|||||||
cmpw r4, r29
|
cmpw r4, r29
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 1
|
addi r4, r3, 1
|
||||||
cmpw r4, r5
|
PPC_REG_CMP r4, r5
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 2
|
addi r4, r3, 2
|
||||||
cmpw r4, r6
|
PPC_REG_CMP r4, r6
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 3
|
addi r4, r3, 3
|
||||||
cmpw r4, r7
|
PPC_REG_CMP r4, r7
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 4
|
addi r4, r3, 4
|
||||||
cmpw r4, r8
|
PPC_REG_CMP r4, r8
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 5
|
addi r4, r3, 5
|
||||||
cmpw r4, r9
|
PPC_REG_CMP r4, r9
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 6
|
addi r4, r3, 6
|
||||||
cmpw r4, r10
|
PPC_REG_CMP r4, r10
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 7
|
addi r4, r3, 7
|
||||||
cmpw r4, r11
|
PPC_REG_CMP r4, r11
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 8
|
addi r4, r3, 8
|
||||||
cmpw r4, r12
|
PPC_REG_CMP r4, r12
|
||||||
bne restore
|
bne restore
|
||||||
|
#ifdef __powerpc64__
|
||||||
|
lis r4, .TOC.@highest
|
||||||
|
ori r4, r4, .TOC.@higher
|
||||||
|
rldicr r4, r4, 32, 31
|
||||||
|
oris r4, r4, .TOC.@h
|
||||||
|
ori r4, r4, .TOC.@l
|
||||||
|
PPC_REG_CMP r4, r2
|
||||||
|
#else
|
||||||
lis r4, _SDA_BASE_@h
|
lis r4, _SDA_BASE_@h
|
||||||
ori r4, r4, _SDA_BASE_@l
|
ori r4, r4, _SDA_BASE_@l
|
||||||
cmpw r4, r13
|
PPC_REG_CMP r4, r13
|
||||||
|
#endif
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 9
|
addi r4, r3, 9
|
||||||
cmpw r4, r14
|
PPC_REG_CMP r4, r14
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 10
|
addi r4, r3, 10
|
||||||
cmpw r4, r15
|
PPC_REG_CMP r4, r15
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 11
|
addi r4, r3, 11
|
||||||
cmpw r4, r16
|
PPC_REG_CMP r4, r16
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 12
|
addi r4, r3, 12
|
||||||
cmpw r4, r17
|
PPC_REG_CMP r4, r17
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 13
|
addi r4, r3, 13
|
||||||
cmpw r4, r18
|
PPC_REG_CMP r4, r18
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 14
|
addi r4, r3, 14
|
||||||
cmpw r4, r19
|
PPC_REG_CMP r4, r19
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 15
|
addi r4, r3, 15
|
||||||
cmpw r4, r20
|
PPC_REG_CMP r4, r20
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 16
|
addi r4, r3, 16
|
||||||
cmpw r4, r21
|
PPC_REG_CMP r4, r21
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 17
|
addi r4, r3, 17
|
||||||
cmpw r4, r22
|
PPC_REG_CMP r4, r22
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 18
|
addi r4, r3, 18
|
||||||
cmpw r4, r23
|
PPC_REG_CMP r4, r23
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 19
|
addi r4, r3, 19
|
||||||
cmpw r4, r24
|
PPC_REG_CMP r4, r24
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 20
|
addi r4, r3, 20
|
||||||
cmpw r4, r25
|
PPC_REG_CMP r4, r25
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 21
|
addi r4, r3, 21
|
||||||
cmpw r4, r26
|
PPC_REG_CMP r4, r26
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 22
|
addi r4, r3, 22
|
||||||
cmpw r4, r27
|
PPC_REG_CMP r4, r27
|
||||||
bne restore
|
bne restore
|
||||||
|
#ifdef __powerpc64__
|
||||||
|
xor r4, r13, r3
|
||||||
|
#else
|
||||||
xor r4, r2, r3
|
xor r4, r2, r3
|
||||||
cmpw r4, r28
|
#endif
|
||||||
|
PPC_REG_CMP r4, r28
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 24
|
addi r4, r3, 24
|
||||||
cmpw r4, r29
|
PPC_REG_CMP r4, r29
|
||||||
bne restore
|
bne restore
|
||||||
mfmsr r4
|
mfmsr r4
|
||||||
xor r4, r4, r3
|
xor r4, r4, r3
|
||||||
cmpw r4, r30
|
PPC_REG_CMP r4, r30
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 25
|
addi r4, r3, 25
|
||||||
mflr r5
|
mflr r5
|
||||||
cmpw r4, r5
|
PPC_REG_CMP r4, r5
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 26
|
addi r4, r3, 26
|
||||||
mfctr r5
|
mfctr r5
|
||||||
cmpw r4, r5
|
PPC_REG_CMP r4, r5
|
||||||
bne restore
|
bne restore
|
||||||
rlwinm r4, r3, 0, 25, 2
|
rlwinm r4, r3, 0, 25, 2
|
||||||
mfxer r5
|
mfxer r5
|
||||||
cmpw r4, r5
|
cmpw r4, r5
|
||||||
bne restore
|
bne restore
|
||||||
addi r4, r3, 28
|
addi r4, r3, 28
|
||||||
cmpw r4, r0
|
PPC_REG_CMP r4, r0
|
||||||
bne restore
|
bne restore
|
||||||
cmpw r31, r1
|
PPC_REG_CMP r31, r1
|
||||||
bne restore
|
bne restore
|
||||||
|
|
||||||
#ifdef PPC_MULTILIB_FPU
|
#ifdef PPC_MULTILIB_FPU
|
||||||
@@ -614,27 +631,27 @@ restore:
|
|||||||
lfd f14, F14_OFFSET(r1)
|
lfd f14, F14_OFFSET(r1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
lwz r31, GPR31_OFFSET(r1)
|
PPC_REG_LOAD r31, GPR31_OFFSET(r1)
|
||||||
lwz r30, GPR30_OFFSET(r1)
|
PPC_REG_LOAD r30, GPR30_OFFSET(r1)
|
||||||
lwz r29, GPR29_OFFSET(r1)
|
PPC_REG_LOAD r29, GPR29_OFFSET(r1)
|
||||||
lwz r28, GPR28_OFFSET(r1)
|
PPC_REG_LOAD r28, GPR28_OFFSET(r1)
|
||||||
lwz r27, GPR27_OFFSET(r1)
|
PPC_REG_LOAD r27, GPR27_OFFSET(r1)
|
||||||
lwz r26, GPR26_OFFSET(r1)
|
PPC_REG_LOAD r26, GPR26_OFFSET(r1)
|
||||||
lwz r25, GPR25_OFFSET(r1)
|
PPC_REG_LOAD r25, GPR25_OFFSET(r1)
|
||||||
lwz r24, GPR24_OFFSET(r1)
|
PPC_REG_LOAD r24, GPR24_OFFSET(r1)
|
||||||
lwz r23, GPR23_OFFSET(r1)
|
PPC_REG_LOAD r23, GPR23_OFFSET(r1)
|
||||||
lwz r22, GPR22_OFFSET(r1)
|
PPC_REG_LOAD r22, GPR22_OFFSET(r1)
|
||||||
lwz r21, GPR21_OFFSET(r1)
|
PPC_REG_LOAD r21, GPR21_OFFSET(r1)
|
||||||
lwz r20, GPR20_OFFSET(r1)
|
PPC_REG_LOAD r20, GPR20_OFFSET(r1)
|
||||||
lwz r19, GPR19_OFFSET(r1)
|
PPC_REG_LOAD r19, GPR19_OFFSET(r1)
|
||||||
lwz r18, GPR18_OFFSET(r1)
|
PPC_REG_LOAD r18, GPR18_OFFSET(r1)
|
||||||
lwz r17, GPR17_OFFSET(r1)
|
PPC_REG_LOAD r17, GPR17_OFFSET(r1)
|
||||||
lwz r16, GPR16_OFFSET(r1)
|
PPC_REG_LOAD r16, GPR16_OFFSET(r1)
|
||||||
lwz r15, GPR15_OFFSET(r1)
|
PPC_REG_LOAD r15, GPR15_OFFSET(r1)
|
||||||
lwz r14, GPR14_OFFSET(r1)
|
PPC_REG_LOAD r14, GPR14_OFFSET(r1)
|
||||||
lwz r4, CR_OFFSET(r1)
|
lwz r4, CR_OFFSET(r1)
|
||||||
mtcr r4
|
mtcr r4
|
||||||
lwz r4, LR_OFFSET(r1)
|
PPC_REG_LOAD r4, LR_OFFSET(r1)
|
||||||
mtlr r4
|
mtlr r4
|
||||||
addi r1, r1, FRAME_SIZE
|
addi r1, r1, FRAME_SIZE
|
||||||
blr
|
blr
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 embedded brains GmbH. All rights reserved.
|
* Copyright (c) 2013, 2017 embedded brains GmbH. All rights reserved.
|
||||||
*
|
*
|
||||||
* embedded brains GmbH
|
* embedded brains GmbH
|
||||||
* Dornierstr. 4
|
* Dornierstr. 4
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <rtems/asm.h>
|
#include <rtems/asm.h>
|
||||||
|
#include <rtems/score/cpu.h>
|
||||||
|
|
||||||
.global _CPU_Context_volatile_clobber
|
.global _CPU_Context_volatile_clobber
|
||||||
|
|
||||||
@@ -25,24 +26,24 @@ _CPU_Context_volatile_clobber:
|
|||||||
#ifdef PPC_MULTILIB_FPU
|
#ifdef PPC_MULTILIB_FPU
|
||||||
.macro CLOBBER_F i
|
.macro CLOBBER_F i
|
||||||
addi r4, r3, 0x100 + \i
|
addi r4, r3, 0x100 + \i
|
||||||
stw r4, 16(r1)
|
stw r4, 32(r1)
|
||||||
addi r4, r3, 0x200 + \i
|
addi r4, r3, 0x200 + \i
|
||||||
stw r4, 16 + 4(r1)
|
stw r4, 32 + 4(r1)
|
||||||
lfd \i, 16(r1)
|
lfd \i, 32(r1)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
stwu r1, -32(r1)
|
PPC_REG_STORE_UPDATE r1, -96(r1)
|
||||||
|
|
||||||
/* Negate FPSCR[FPRF] bits */
|
/* Negate FPSCR[FPRF] bits */
|
||||||
mffs f0
|
mffs f0
|
||||||
stfd f0, 16(r1)
|
stfd f0, 32(r1)
|
||||||
lwz r0, 20(r1)
|
lwz r0, 36(r1)
|
||||||
nor r3, r0, r0
|
nor r3, r0, r0
|
||||||
rlwinm r0, r0, 0, 20, 14
|
rlwinm r0, r0, 0, 20, 14
|
||||||
rlwinm r3, r3, 0, 15, 19
|
rlwinm r3, r3, 0, 15, 19
|
||||||
or r0, r3, r0
|
or r0, r3, r0
|
||||||
stw r0, 20(r1)
|
stw r0, 36(r1)
|
||||||
lfd f0, 16(r1)
|
lfd f0, 32(r1)
|
||||||
mtfsf 0xff, f0
|
mtfsf 0xff, f0
|
||||||
|
|
||||||
CLOBBER_F 0
|
CLOBBER_F 0
|
||||||
@@ -59,36 +60,36 @@ _CPU_Context_volatile_clobber:
|
|||||||
CLOBBER_F 11
|
CLOBBER_F 11
|
||||||
CLOBBER_F 12
|
CLOBBER_F 12
|
||||||
CLOBBER_F 13
|
CLOBBER_F 13
|
||||||
addi r1, r1, 32
|
addi r1, r1, 96
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PPC_MULTILIB_ALTIVEC
|
#ifdef PPC_MULTILIB_ALTIVEC
|
||||||
.macro CLOBBER_V i
|
.macro CLOBBER_V i
|
||||||
addi r4, r3, 0x300 + \i
|
addi r4, r3, 0x300 + \i
|
||||||
stw r4, 16(r1)
|
stw r4, 32(r1)
|
||||||
addi r4, r3, 0x400 + \i
|
addi r4, r3, 0x400 + \i
|
||||||
stw r4, 16 + 4(r1)
|
stw r4, 32 + 4(r1)
|
||||||
addi r4, r3, 0x500 + \i
|
addi r4, r3, 0x500 + \i
|
||||||
stw r4, 16 + 8(r1)
|
stw r4, 32 + 8(r1)
|
||||||
addi r4, r3, 0x600 + \i
|
addi r4, r3, 0x600 + \i
|
||||||
stw r4, 16 + 12(r1)
|
stw r4, 32 + 12(r1)
|
||||||
li r4, 16
|
li r4, 32
|
||||||
lvx \i, r1, r4
|
lvx \i, r1, r4
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
stwu r1, -32(r1)
|
PPC_REG_STORE_UPDATE r1, -96(r1)
|
||||||
|
|
||||||
/* Negate VSCR[SAT] bit */
|
/* Negate VSCR[SAT] bit */
|
||||||
mfvscr v0
|
mfvscr v0
|
||||||
li r3, 28
|
li r3, 44
|
||||||
stvewx v0, r1, r3
|
stvewx v0, r1, r3
|
||||||
lwz r0, 28(r1)
|
lwz r0, 44(r1)
|
||||||
nor r3, r0, r0
|
nor r3, r0, r0
|
||||||
rlwinm r0, r0, 0, 0, 30
|
rlwinm r0, r0, 0, 0, 30
|
||||||
rlwinm r3, r3, 0, 31, 31
|
rlwinm r3, r3, 0, 31, 31
|
||||||
or r0, r3, r0
|
or r0, r3, r0
|
||||||
stw r0, 28(r1)
|
stw r0, 44(r1)
|
||||||
li r3, 28
|
li r3, 44
|
||||||
lvewx v0, r1, r3
|
lvewx v0, r1, r3
|
||||||
mtvscr v0
|
mtvscr v0
|
||||||
|
|
||||||
@@ -112,7 +113,7 @@ _CPU_Context_volatile_clobber:
|
|||||||
CLOBBER_V 17
|
CLOBBER_V 17
|
||||||
CLOBBER_V 18
|
CLOBBER_V 18
|
||||||
CLOBBER_V 19
|
CLOBBER_V 19
|
||||||
addi r1, r1, 32
|
addi r1, r1, 96
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
addi r4, r3, 10
|
addi r4, r3, 10
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2001 Surrey Satellite Technology Limited (SSTL).
|
* Copyright (c) 2001 Surrey Satellite Technology Limited (SSTL).
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010, 2016 embedded brains GmbH.
|
* Copyright (c) 2010, 2017 embedded brains GmbH.
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
* found in the file LICENSE in this distribution or at
|
* found in the file LICENSE in this distribution or at
|
||||||
@@ -181,10 +181,16 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __SPE__
|
#ifndef __SPE__
|
||||||
#define PPC_GPR_TYPE uint32_t
|
#define PPC_GPR_TYPE uintptr_t
|
||||||
|
#if defined(__powerpc64__)
|
||||||
|
#define PPC_GPR_SIZE 8
|
||||||
|
#define PPC_GPR_LOAD ld
|
||||||
|
#define PPC_GPR_STORE std
|
||||||
|
#else
|
||||||
#define PPC_GPR_SIZE 4
|
#define PPC_GPR_SIZE 4
|
||||||
#define PPC_GPR_LOAD lwz
|
#define PPC_GPR_LOAD lwz
|
||||||
#define PPC_GPR_STORE stw
|
#define PPC_GPR_STORE stw
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#define PPC_GPR_TYPE uint64_t
|
#define PPC_GPR_TYPE uint64_t
|
||||||
#define PPC_GPR_SIZE 8
|
#define PPC_GPR_SIZE 8
|
||||||
@@ -192,6 +198,20 @@ extern "C" {
|
|||||||
#define PPC_GPR_STORE evstdd
|
#define PPC_GPR_STORE evstdd
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__powerpc64__)
|
||||||
|
#define PPC_REG_SIZE 8
|
||||||
|
#define PPC_REG_LOAD ld
|
||||||
|
#define PPC_REG_STORE std
|
||||||
|
#define PPC_REG_STORE_UPDATE stdu
|
||||||
|
#define PPC_REG_CMP cmpd
|
||||||
|
#else
|
||||||
|
#define PPC_REG_SIZE 4
|
||||||
|
#define PPC_REG_LOAD lwz
|
||||||
|
#define PPC_REG_STORE stw
|
||||||
|
#define PPC_REG_STORE_UPDATE stwu
|
||||||
|
#define PPC_REG_CMP cmpw
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef ASM
|
#ifndef ASM
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -200,10 +220,10 @@ extern "C" {
|
|||||||
* Linux and Embedded")
|
* Linux and Embedded")
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t gpr1;
|
|
||||||
uint32_t msr;
|
uint32_t msr;
|
||||||
uint32_t lr;
|
|
||||||
uint32_t cr;
|
uint32_t cr;
|
||||||
|
uintptr_t gpr1;
|
||||||
|
uintptr_t lr;
|
||||||
PPC_GPR_TYPE gpr14;
|
PPC_GPR_TYPE gpr14;
|
||||||
PPC_GPR_TYPE gpr15;
|
PPC_GPR_TYPE gpr15;
|
||||||
PPC_GPR_TYPE gpr16;
|
PPC_GPR_TYPE gpr16;
|
||||||
@@ -275,7 +295,7 @@ typedef struct {
|
|||||||
* the previous items to optimize the context switch. We must not set the
|
* the previous items to optimize the context switch. We must not set the
|
||||||
* following items to zero via the dcbz.
|
* following items to zero via the dcbz.
|
||||||
*/
|
*/
|
||||||
uint32_t gpr2;
|
uintptr_t tp;
|
||||||
#if defined(RTEMS_SMP)
|
#if defined(RTEMS_SMP)
|
||||||
volatile uint32_t is_executing;
|
volatile uint32_t is_executing;
|
||||||
#endif
|
#endif
|
||||||
@@ -322,13 +342,14 @@ static inline ppc_context *ppc_get_context( const Context_Control *context )
|
|||||||
#endif
|
#endif
|
||||||
#endif /* ASM */
|
#endif /* ASM */
|
||||||
|
|
||||||
#define PPC_CONTEXT_OFFSET_GPR1 (PPC_DEFAULT_CACHE_LINE_SIZE + 0)
|
#define PPC_CONTEXT_OFFSET_MSR (PPC_DEFAULT_CACHE_LINE_SIZE)
|
||||||
#define PPC_CONTEXT_OFFSET_MSR (PPC_DEFAULT_CACHE_LINE_SIZE + 4)
|
#define PPC_CONTEXT_OFFSET_CR (PPC_DEFAULT_CACHE_LINE_SIZE + 4)
|
||||||
#define PPC_CONTEXT_OFFSET_LR (PPC_DEFAULT_CACHE_LINE_SIZE + 8)
|
#define PPC_CONTEXT_OFFSET_GPR1 (PPC_DEFAULT_CACHE_LINE_SIZE + 8)
|
||||||
#define PPC_CONTEXT_OFFSET_CR (PPC_DEFAULT_CACHE_LINE_SIZE + 12)
|
#define PPC_CONTEXT_OFFSET_LR (PPC_DEFAULT_CACHE_LINE_SIZE + PPC_REG_SIZE + 8)
|
||||||
|
|
||||||
#define PPC_CONTEXT_GPR_OFFSET( gpr ) \
|
#define PPC_CONTEXT_GPR_OFFSET( gpr ) \
|
||||||
(((gpr) - 14) * PPC_GPR_SIZE + PPC_DEFAULT_CACHE_LINE_SIZE + 16)
|
(((gpr) - 14) * PPC_GPR_SIZE + \
|
||||||
|
PPC_DEFAULT_CACHE_LINE_SIZE + 8 + 2 * PPC_REG_SIZE)
|
||||||
|
|
||||||
#define PPC_CONTEXT_OFFSET_GPR14 PPC_CONTEXT_GPR_OFFSET( 14 )
|
#define PPC_CONTEXT_OFFSET_GPR14 PPC_CONTEXT_GPR_OFFSET( 14 )
|
||||||
#define PPC_CONTEXT_OFFSET_GPR15 PPC_CONTEXT_GPR_OFFSET( 15 )
|
#define PPC_CONTEXT_OFFSET_GPR15 PPC_CONTEXT_GPR_OFFSET( 15 )
|
||||||
@@ -352,7 +373,7 @@ static inline ppc_context *ppc_get_context( const Context_Control *context )
|
|||||||
|
|
||||||
#ifdef PPC_MULTILIB_ALTIVEC
|
#ifdef PPC_MULTILIB_ALTIVEC
|
||||||
#define PPC_CONTEXT_OFFSET_V( v ) \
|
#define PPC_CONTEXT_OFFSET_V( v ) \
|
||||||
( ( ( v ) - 20 ) * 16 + PPC_DEFAULT_CACHE_LINE_SIZE + 96 )
|
( ( ( v ) - 20 ) * 16 + PPC_CONTEXT_OFFSET_ISR_DISPATCH_DISABLE + 8)
|
||||||
#define PPC_CONTEXT_OFFSET_V20 PPC_CONTEXT_OFFSET_V( 20 )
|
#define PPC_CONTEXT_OFFSET_V20 PPC_CONTEXT_OFFSET_V( 20 )
|
||||||
#define PPC_CONTEXT_OFFSET_V21 PPC_CONTEXT_OFFSET_V( 21 )
|
#define PPC_CONTEXT_OFFSET_V21 PPC_CONTEXT_OFFSET_V( 21 )
|
||||||
#define PPC_CONTEXT_OFFSET_V22 PPC_CONTEXT_OFFSET_V( 22 )
|
#define PPC_CONTEXT_OFFSET_V22 PPC_CONTEXT_OFFSET_V( 22 )
|
||||||
@@ -367,10 +388,10 @@ static inline ppc_context *ppc_get_context( const Context_Control *context )
|
|||||||
#define PPC_CONTEXT_OFFSET_V31 PPC_CONTEXT_OFFSET_V( 31 )
|
#define PPC_CONTEXT_OFFSET_V31 PPC_CONTEXT_OFFSET_V( 31 )
|
||||||
#define PPC_CONTEXT_OFFSET_VRSAVE PPC_CONTEXT_OFFSET_V( 32 )
|
#define PPC_CONTEXT_OFFSET_VRSAVE PPC_CONTEXT_OFFSET_V( 32 )
|
||||||
#define PPC_CONTEXT_OFFSET_F( f ) \
|
#define PPC_CONTEXT_OFFSET_F( f ) \
|
||||||
( ( ( f ) - 14 ) * 8 + PPC_DEFAULT_CACHE_LINE_SIZE + 296 )
|
( ( ( f ) - 14 ) * 8 + PPC_CONTEXT_OFFSET_VRSAVE + 8 )
|
||||||
#else
|
#else
|
||||||
#define PPC_CONTEXT_OFFSET_F( f ) \
|
#define PPC_CONTEXT_OFFSET_F( f ) \
|
||||||
( ( ( f ) - 14 ) * 8 + PPC_DEFAULT_CACHE_LINE_SIZE + 96 )
|
( ( ( f ) - 14 ) * 8 + PPC_CONTEXT_OFFSET_ISR_DISPATCH_DISABLE + 8 )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PPC_MULTILIB_FPU
|
#ifdef PPC_MULTILIB_FPU
|
||||||
@@ -406,10 +427,11 @@ static inline ppc_context *ppc_get_context( const Context_Control *context )
|
|||||||
#define PPC_CONTEXT_VOLATILE_SIZE (PPC_CONTEXT_GPR_OFFSET( 32 ) + 8)
|
#define PPC_CONTEXT_VOLATILE_SIZE (PPC_CONTEXT_GPR_OFFSET( 32 ) + 8)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PPC_CONTEXT_OFFSET_GPR2 PPC_CONTEXT_VOLATILE_SIZE
|
#define PPC_CONTEXT_OFFSET_TP PPC_CONTEXT_VOLATILE_SIZE
|
||||||
|
|
||||||
#ifdef RTEMS_SMP
|
#ifdef RTEMS_SMP
|
||||||
#define PPC_CONTEXT_OFFSET_IS_EXECUTING (PPC_CONTEXT_VOLATILE_SIZE + 4)
|
#define PPC_CONTEXT_OFFSET_IS_EXECUTING \
|
||||||
|
(PPC_CONTEXT_OFFSET_TP + PPC_REG_SIZE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ASM
|
#ifndef ASM
|
||||||
@@ -1056,13 +1078,15 @@ void _CPU_Context_validate( uintptr_t pattern );
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t EXC_SRR0;
|
uintptr_t EXC_SRR0;
|
||||||
uint32_t EXC_SRR1;
|
uintptr_t EXC_SRR1;
|
||||||
uint32_t _EXC_number;
|
uint32_t _EXC_number;
|
||||||
|
uint32_t RESERVED_FOR_ALIGNMENT_0;
|
||||||
uint32_t EXC_CR;
|
uint32_t EXC_CR;
|
||||||
uint32_t EXC_CTR;
|
|
||||||
uint32_t EXC_XER;
|
uint32_t EXC_XER;
|
||||||
uint32_t EXC_LR;
|
uintptr_t EXC_CTR;
|
||||||
|
uintptr_t EXC_LR;
|
||||||
|
uintptr_t RESERVED_FOR_ALIGNMENT_1;
|
||||||
#ifdef __SPE__
|
#ifdef __SPE__
|
||||||
uint32_t EXC_SPEFSCR;
|
uint32_t EXC_SPEFSCR;
|
||||||
uint64_t EXC_ACC;
|
uint64_t EXC_ACC;
|
||||||
@@ -1099,13 +1123,13 @@ typedef struct {
|
|||||||
PPC_GPR_TYPE GPR29;
|
PPC_GPR_TYPE GPR29;
|
||||||
PPC_GPR_TYPE GPR30;
|
PPC_GPR_TYPE GPR30;
|
||||||
PPC_GPR_TYPE GPR31;
|
PPC_GPR_TYPE GPR31;
|
||||||
#if defined(PPC_MULTILIB_ALTIVEC) || defined(PPC_MULTILIB_FPU)
|
uintptr_t RESERVED_FOR_ALIGNMENT_2;
|
||||||
uint32_t reserved_for_alignment;
|
|
||||||
#endif
|
|
||||||
#ifdef PPC_MULTILIB_ALTIVEC
|
#ifdef PPC_MULTILIB_ALTIVEC
|
||||||
uint32_t VRSAVE;
|
uint32_t VRSAVE;
|
||||||
|
uint32_t RESERVED_FOR_ALIGNMENT_3[3];
|
||||||
|
|
||||||
/* This field must take stvewx/lvewx requirements into account */
|
/* This field must take stvewx/lvewx requirements into account */
|
||||||
|
uint32_t RESERVED_FOR_ALIGNMENT_4[3];
|
||||||
uint32_t VSCR;
|
uint32_t VSCR;
|
||||||
|
|
||||||
uint8_t V0[16];
|
uint8_t V0[16];
|
||||||
@@ -1175,6 +1199,7 @@ typedef struct {
|
|||||||
double F30;
|
double F30;
|
||||||
double F31;
|
double F31;
|
||||||
uint64_t FPSCR;
|
uint64_t FPSCR;
|
||||||
|
uint64_t RESERVED_FOR_ALIGNMENT_5;
|
||||||
#endif
|
#endif
|
||||||
} CPU_Exception_frame;
|
} CPU_Exception_frame;
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (C) 2007 Till Straumann <strauman@slac.stanford.edu>
|
* Copyright (C) 2007 Till Straumann <strauman@slac.stanford.edu>
|
||||||
*
|
*
|
||||||
* Copyright (c) 2009, 2016 embedded brains GmbH
|
* Copyright (c) 2009, 2017 embedded brains GmbH
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
* found in the file LICENSE in this distribution or at
|
* found in the file LICENSE in this distribution or at
|
||||||
@@ -22,13 +22,71 @@
|
|||||||
|
|
||||||
#include <rtems/score/cpu.h>
|
#include <rtems/score/cpu.h>
|
||||||
|
|
||||||
#define SRR0_FRAME_OFFSET 8
|
/* Exception stack frame -> BSP_Exception_frame */
|
||||||
#define SRR1_FRAME_OFFSET 12
|
#ifdef __powerpc64__
|
||||||
#define EXCEPTION_NUMBER_OFFSET 16
|
#define FRAME_LINK_SPACE 32
|
||||||
#define EXC_CR_OFFSET 20
|
#else
|
||||||
#define EXC_CTR_OFFSET 24
|
#define FRAME_LINK_SPACE 8
|
||||||
#define EXC_XER_OFFSET 28
|
#endif
|
||||||
#define EXC_LR_OFFSET 32
|
|
||||||
|
#define SRR0_FRAME_OFFSET FRAME_LINK_SPACE
|
||||||
|
#define SRR1_FRAME_OFFSET (SRR0_FRAME_OFFSET + PPC_REG_SIZE)
|
||||||
|
#define EXCEPTION_NUMBER_OFFSET (SRR1_FRAME_OFFSET + PPC_REG_SIZE)
|
||||||
|
#define PPC_EXC_INTERRUPT_ENTRY_INSTANT_OFFSET (EXCEPTION_NUMBER_OFFSET + 4)
|
||||||
|
#define EXC_CR_OFFSET (EXCEPTION_NUMBER_OFFSET + 8)
|
||||||
|
#define EXC_XER_OFFSET (EXC_CR_OFFSET + 4)
|
||||||
|
#define EXC_CTR_OFFSET (EXC_XER_OFFSET + 4)
|
||||||
|
#define EXC_LR_OFFSET (EXC_CTR_OFFSET + PPC_REG_SIZE)
|
||||||
|
#define PPC_EXC_INTERRUPT_FRAME_OFFSET (EXC_LR_OFFSET + PPC_REG_SIZE)
|
||||||
|
|
||||||
|
#ifndef __SPE__
|
||||||
|
#define PPC_EXC_GPR_OFFSET(gpr) \
|
||||||
|
((gpr) * PPC_GPR_SIZE + PPC_EXC_INTERRUPT_FRAME_OFFSET + PPC_REG_SIZE)
|
||||||
|
#define PPC_EXC_VECTOR_PROLOGUE_OFFSET PPC_EXC_GPR_OFFSET(4)
|
||||||
|
#if defined(PPC_MULTILIB_ALTIVEC) && defined(PPC_MULTILIB_FPU)
|
||||||
|
#define PPC_EXC_VRSAVE_OFFSET PPC_EXC_GPR_OFFSET(33)
|
||||||
|
#define PPC_EXC_VSCR_OFFSET (PPC_EXC_VRSAVE_OFFSET + 28)
|
||||||
|
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + PPC_EXC_VSCR_OFFSET + 4)
|
||||||
|
#define PPC_EXC_FR_OFFSET(f) ((f) * 8 + PPC_EXC_VR_OFFSET(32))
|
||||||
|
#define PPC_EXC_FPSCR_OFFSET PPC_EXC_FR_OFFSET(32)
|
||||||
|
#define PPC_EXC_FRAME_SIZE PPC_EXC_FR_OFFSET(34)
|
||||||
|
#define PPC_EXC_MIN_VSCR_OFFSET (PPC_EXC_GPR_OFFSET(13) + 12)
|
||||||
|
#define PPC_EXC_MIN_VR_OFFSET(v) ((v) * 16 + PPC_EXC_MIN_VSCR_OFFSET + 4)
|
||||||
|
#define PPC_EXC_MIN_FR_OFFSET(f) ((f) * 8 + PPC_EXC_MIN_VR_OFFSET(20))
|
||||||
|
#define PPC_EXC_MIN_FPSCR_OFFSET PPC_EXC_MIN_FR_OFFSET(14)
|
||||||
|
#define CPU_INTERRUPT_FRAME_SIZE \
|
||||||
|
(PPC_EXC_MIN_FR_OFFSET(16) + PPC_STACK_RED_ZONE_SIZE)
|
||||||
|
#elif defined(PPC_MULTILIB_ALTIVEC)
|
||||||
|
#define PPC_EXC_VRSAVE_OFFSET PPC_EXC_GPR_OFFSET(33)
|
||||||
|
#define PPC_EXC_VSCR_OFFSET (PPC_EXC_VRSAVE_OFFSET + 28)
|
||||||
|
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + PPC_EXC_VSCR_OFFSET + 4)
|
||||||
|
#define PPC_EXC_FRAME_SIZE PPC_EXC_VR_OFFSET(32)
|
||||||
|
#define PPC_EXC_MIN_VSCR_OFFSET (PPC_EXC_GPR_OFFSET(13) + 12)
|
||||||
|
#define PPC_EXC_MIN_VR_OFFSET(v) ((v) * 16 + PPC_EXC_MIN_VSCR_OFFSET + 4)
|
||||||
|
#define CPU_INTERRUPT_FRAME_SIZE \
|
||||||
|
(PPC_EXC_MIN_VR_OFFSET(20) + PPC_STACK_RED_ZONE_SIZE)
|
||||||
|
#elif defined(PPC_MULTILIB_FPU)
|
||||||
|
#define PPC_EXC_FR_OFFSET(f) ((f) * 8 + PPC_EXC_GPR_OFFSET(33))
|
||||||
|
#define PPC_EXC_FPSCR_OFFSET PPC_EXC_FR_OFFSET(32)
|
||||||
|
#define PPC_EXC_FRAME_SIZE PPC_EXC_FR_OFFSET(34)
|
||||||
|
#define PPC_EXC_MIN_FR_OFFSET(f) ((f) * 8 + PPC_EXC_GPR_OFFSET(13))
|
||||||
|
#define PPC_EXC_MIN_FPSCR_OFFSET PPC_EXC_MIN_FR_OFFSET(14)
|
||||||
|
#define CPU_INTERRUPT_FRAME_SIZE \
|
||||||
|
(PPC_EXC_MIN_FR_OFFSET(16) + PPC_STACK_RED_ZONE_SIZE)
|
||||||
|
#else
|
||||||
|
#define PPC_EXC_FRAME_SIZE PPC_EXC_GPR_OFFSET(33)
|
||||||
|
#define CPU_INTERRUPT_FRAME_SIZE \
|
||||||
|
(PPC_EXC_GPR_OFFSET(13) + PPC_STACK_RED_ZONE_SIZE)
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define PPC_EXC_SPEFSCR_OFFSET 44
|
||||||
|
#define PPC_EXC_ACC_OFFSET 48
|
||||||
|
#define PPC_EXC_GPR_OFFSET(gpr) ((gpr) * PPC_GPR_SIZE + 56)
|
||||||
|
#define PPC_EXC_VECTOR_PROLOGUE_OFFSET (PPC_EXC_GPR_OFFSET(4) + 4)
|
||||||
|
#define CPU_INTERRUPT_FRAME_SIZE (160 + PPC_STACK_RED_ZONE_SIZE)
|
||||||
|
#define PPC_EXC_FRAME_SIZE 320
|
||||||
|
#endif
|
||||||
|
|
||||||
#define GPR0_OFFSET PPC_EXC_GPR_OFFSET(0)
|
#define GPR0_OFFSET PPC_EXC_GPR_OFFSET(0)
|
||||||
#define GPR1_OFFSET PPC_EXC_GPR_OFFSET(1)
|
#define GPR1_OFFSET PPC_EXC_GPR_OFFSET(1)
|
||||||
#define GPR2_OFFSET PPC_EXC_GPR_OFFSET(2)
|
#define GPR2_OFFSET PPC_EXC_GPR_OFFSET(2)
|
||||||
@@ -62,52 +120,6 @@
|
|||||||
#define GPR30_OFFSET PPC_EXC_GPR_OFFSET(30)
|
#define GPR30_OFFSET PPC_EXC_GPR_OFFSET(30)
|
||||||
#define GPR31_OFFSET PPC_EXC_GPR_OFFSET(31)
|
#define GPR31_OFFSET PPC_EXC_GPR_OFFSET(31)
|
||||||
|
|
||||||
/* Exception stack frame -> BSP_Exception_frame */
|
|
||||||
#define FRAME_LINK_SPACE 8
|
|
||||||
|
|
||||||
#ifndef __SPE__
|
|
||||||
#define PPC_EXC_GPR_OFFSET(gpr) ((gpr) * PPC_GPR_SIZE + 36)
|
|
||||||
#define PPC_EXC_VECTOR_PROLOGUE_OFFSET PPC_EXC_GPR_OFFSET(4)
|
|
||||||
#if defined(PPC_MULTILIB_ALTIVEC) && defined(PPC_MULTILIB_FPU)
|
|
||||||
#define PPC_EXC_VRSAVE_OFFSET 168
|
|
||||||
#define PPC_EXC_VSCR_OFFSET 172
|
|
||||||
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + 176)
|
|
||||||
#define PPC_EXC_FR_OFFSET(f) ((f) * 8 + 688)
|
|
||||||
#define PPC_EXC_FPSCR_OFFSET 944
|
|
||||||
#define PPC_EXC_FRAME_SIZE 960
|
|
||||||
#define PPC_EXC_MIN_VSCR_OFFSET 92
|
|
||||||
#define PPC_EXC_MIN_VR_OFFSET(v) ((v) * 16 + 96)
|
|
||||||
#define PPC_EXC_MIN_FR_OFFSET(f) ((f) * 8 + 416)
|
|
||||||
#define PPC_EXC_MIN_FPSCR_OFFSET 528
|
|
||||||
#define CPU_INTERRUPT_FRAME_SIZE 544
|
|
||||||
#elif defined(PPC_MULTILIB_ALTIVEC)
|
|
||||||
#define PPC_EXC_VRSAVE_OFFSET 168
|
|
||||||
#define PPC_EXC_VSCR_OFFSET 172
|
|
||||||
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + 176)
|
|
||||||
#define PPC_EXC_FRAME_SIZE 688
|
|
||||||
#define PPC_EXC_MIN_VSCR_OFFSET 92
|
|
||||||
#define PPC_EXC_MIN_VR_OFFSET(v) ((v) * 16 + 96)
|
|
||||||
#define CPU_INTERRUPT_FRAME_SIZE 416
|
|
||||||
#elif defined(PPC_MULTILIB_FPU)
|
|
||||||
#define PPC_EXC_FR_OFFSET(f) ((f) * 8 + 168)
|
|
||||||
#define PPC_EXC_FPSCR_OFFSET 424
|
|
||||||
#define PPC_EXC_FRAME_SIZE 448
|
|
||||||
#define PPC_EXC_MIN_FR_OFFSET(f) ((f) * 8 + 96)
|
|
||||||
#define PPC_EXC_MIN_FPSCR_OFFSET 92
|
|
||||||
#define CPU_INTERRUPT_FRAME_SIZE 224
|
|
||||||
#else
|
|
||||||
#define PPC_EXC_FRAME_SIZE 176
|
|
||||||
#define CPU_INTERRUPT_FRAME_SIZE 96
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define PPC_EXC_SPEFSCR_OFFSET 36
|
|
||||||
#define PPC_EXC_ACC_OFFSET 40
|
|
||||||
#define PPC_EXC_GPR_OFFSET(gpr) ((gpr) * PPC_GPR_SIZE + 48)
|
|
||||||
#define PPC_EXC_VECTOR_PROLOGUE_OFFSET (PPC_EXC_GPR_OFFSET(4) + 4)
|
|
||||||
#define CPU_INTERRUPT_FRAME_SIZE 160
|
|
||||||
#define PPC_EXC_FRAME_SIZE 320
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CPU_PER_CPU_CONTROL_SIZE 0
|
#define CPU_PER_CPU_CONTROL_SIZE 0
|
||||||
|
|
||||||
#ifdef RTEMS_SMP
|
#ifdef RTEMS_SMP
|
||||||
@@ -124,15 +136,24 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t FRAME_SP;
|
uintptr_t FRAME_SP;
|
||||||
uint32_t FRAME_LR;
|
#ifdef __powerpc64__
|
||||||
uint32_t EXC_SRR0;
|
uint32_t FRAME_CR;
|
||||||
uint32_t EXC_SRR1;
|
uint32_t FRAME_RESERVED;
|
||||||
uint32_t unused;
|
#endif
|
||||||
|
uintptr_t FRAME_LR;
|
||||||
|
#ifdef __powerpc64__
|
||||||
|
uintptr_t FRAME_TOC;
|
||||||
|
#endif
|
||||||
|
uintptr_t EXC_SRR0;
|
||||||
|
uintptr_t EXC_SRR1;
|
||||||
|
uint32_t RESERVED_FOR_ALIGNMENT_0;
|
||||||
|
uint32_t EXC_INTERRUPT_ENTRY_INSTANT;
|
||||||
uint32_t EXC_CR;
|
uint32_t EXC_CR;
|
||||||
uint32_t EXC_CTR;
|
|
||||||
uint32_t EXC_XER;
|
uint32_t EXC_XER;
|
||||||
uint32_t EXC_LR;
|
uintptr_t EXC_CTR;
|
||||||
|
uintptr_t EXC_LR;
|
||||||
|
uintptr_t EXC_INTERRUPT_FRAME;
|
||||||
#ifdef __SPE__
|
#ifdef __SPE__
|
||||||
uint32_t EXC_SPEFSCR;
|
uint32_t EXC_SPEFSCR;
|
||||||
uint64_t EXC_ACC;
|
uint64_t EXC_ACC;
|
||||||
@@ -150,12 +171,12 @@ typedef struct {
|
|||||||
PPC_GPR_TYPE GPR10;
|
PPC_GPR_TYPE GPR10;
|
||||||
PPC_GPR_TYPE GPR11;
|
PPC_GPR_TYPE GPR11;
|
||||||
PPC_GPR_TYPE GPR12;
|
PPC_GPR_TYPE GPR12;
|
||||||
uint32_t EARLY_INSTANT;
|
|
||||||
#ifdef PPC_MULTILIB_ALTIVEC
|
#ifdef PPC_MULTILIB_ALTIVEC
|
||||||
/* This field must take stvewx/lvewx requirements into account */
|
/* This field must take stvewx/lvewx requirements into account */
|
||||||
|
uint32_t RESERVED_FOR_ALIGNMENT_3[3];
|
||||||
uint32_t VSCR;
|
uint32_t VSCR;
|
||||||
|
|
||||||
uint8_t V0[16] RTEMS_ALIGNED(16);
|
uint8_t V0[16];
|
||||||
uint8_t V1[16];
|
uint8_t V1[16];
|
||||||
uint8_t V2[16];
|
uint8_t V2[16];
|
||||||
uint8_t V3[16];
|
uint8_t V3[16];
|
||||||
@@ -192,9 +213,10 @@ typedef struct {
|
|||||||
double F12;
|
double F12;
|
||||||
double F13;
|
double F13;
|
||||||
uint64_t FPSCR;
|
uint64_t FPSCR;
|
||||||
|
uint64_t RESERVED_FOR_ALIGNMENT_4;
|
||||||
#endif
|
#endif
|
||||||
#if !defined(PPC_MULTILIB_ALTIVEC) && !defined(PPC_MULTILIB_FPU)
|
#if PPC_STACK_RED_ZONE_SIZE > 0
|
||||||
uint32_t RESERVED_FOR_STACK_ALIGNMENT;
|
uint8_t RED_ZONE[ PPC_STACK_RED_ZONE_SIZE ];
|
||||||
#endif
|
#endif
|
||||||
} CPU_Interrupt_frame;
|
} CPU_Interrupt_frame;
|
||||||
|
|
||||||
|
|||||||
@@ -140,6 +140,12 @@ extern "C" {
|
|||||||
#define PPC_ALIGNMENT 8
|
#define PPC_ALIGNMENT 8
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __powerpc64__
|
||||||
|
#define PPC_STACK_RED_ZONE_SIZE 512
|
||||||
|
#else
|
||||||
|
#define PPC_STACK_RED_ZONE_SIZE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unless specified above, If the model has FP support, it is assumed to
|
* Unless specified above, If the model has FP support, it is assumed to
|
||||||
* support doubles (8-byte floating point numbers).
|
* support doubles (8-byte floating point numbers).
|
||||||
|
|||||||
Reference in New Issue
Block a user