RTEMS: PowerPC Exceptions

| RTEMS 5.4-rc2

Loading...
Searching...
No Matches
Modules | Files | Macros | Typedefs | Enumerations | Functions | Variables
PowerPC Exceptions
Board Support Packages » PowerPC » Shared

## Modules
| PowerPC Exception Frame

## Files
file | vectors.h
| PowerPC Exceptions API.
file | ppc_exc_address.c
| PowerPC Exceptions implementation.
file | ppc_exc_categories.c
| PowerPC Exceptions implementation.
file | ppc_exc_global_handler.c
| PowerPC Exceptions implementation.
file | ppc_exc_initialize.c
| PowerPC Exceptions implementation.
file | ppc_exc_print.c
| PowerPC Exceptions implementation.
file | ppc_exc_prologue.c
| PowerPC Exceptions implementation.

## Macros
#define | ASM_RESET_VECTOR 0x01
#define | ASM_MACH_VECTOR 0x02
#define | ASM_PROT_VECTOR 0x03
#define | ASM_ISI_VECTOR 0x04
#define | ASM_EXT_VECTOR 0x05
#define | ASM_ALIGN_VECTOR 0x06
#define | ASM_PROG_VECTOR 0x07
#define | ASM_FLOAT_VECTOR 0x08
#define | ASM_DEC_VECTOR 0x09
#define | ASM_SYS_VECTOR 0x0C
#define | ASM_TRACE_VECTOR 0x0D
#define | ASM_PPC405_APU_UNAVAIL_VECTOR ASM_60X_VEC_ASSIST_VECTOR
#define | ASM_8XX_FLOATASSIST_VECTOR 0x0E
#define | ASM_8XX_SOFTEMUL_VECTOR 0x10
#define | ASM_8XX_ITLBMISS_VECTOR 0x11
#define | ASM_8XX_DTLBMISS_VECTOR 0x12
#define | ASM_8XX_ITLBERROR_VECTOR 0x13
#define | ASM_8XX_DTLBERROR_VECTOR 0x14
#define | ASM_8XX_DBREAK_VECTOR 0x1C
#define | ASM_8XX_IBREAK_VECTOR 0x1D
#define | ASM_8XX_PERIFBREAK_VECTOR 0x1E
#define | ASM_8XX_DEVPORT_VECTOR 0x1F
#define | ASM_5XX_FLOATASSIST_VECTOR 0x0E
#define | ASM_5XX_SOFTEMUL_VECTOR 0x10
#define | ASM_5XX_IPROT_VECTOR 0x13
#define | ASM_5XX_DPROT_VECTOR 0x14
#define | ASM_5XX_DBREAK_VECTOR 0x1C
#define | ASM_5XX_IBREAK_VECTOR 0x1D
#define | ASM_5XX_MEBREAK_VECTOR 0x1E
#define | ASM_5XX_NMEBREAK_VECTOR 0x1F
#define | ASM_60X_VEC_VECTOR 0x0A
#define | ASM_60X_PERFMON_VECTOR 0x0F
#define | ASM_60X_IMISS_VECTOR 0x10
#define | ASM_60X_DLMISS_VECTOR 0x11
#define | ASM_60X_DSMISS_VECTOR 0x12
#define | ASM_60X_ADDR_VECTOR 0x13
#define | ASM_60X_SYSMGMT_VECTOR 0x14
#define | ASM_60X_VEC_ASSIST_VECTOR 0x16
#define | ASM_60X_ITM_VECTOR 0x17
#define | ASM_BOOKE_CRIT_VECTOR 0x01
#define | ASM_BOOKE_DEC_VECTOR 0x10
#define | ASM_BOOKE_ITLBMISS_VECTOR 0x11
#define | ASM_BOOKE_DTLBMISS_VECTOR 0x12
#define | ASM_BOOKE_FIT_VECTOR 0x13
#define | ASM_BOOKE_WDOG_VECTOR 0x14
#define | ASM_BOOKE_APU_VECTOR 0x18
#define | ASM_BOOKE_DEBUG_VECTOR ASM_TRACE_VECTOR
#define | ASM_E500_SPE_UNAVAILABLE_VECTOR ASM_60X_VEC_VECTOR
#define | ASM_E500_EMB_FP_DATA_VECTOR 0x19
#define | ASM_E500_EMB_FP_ROUND_VECTOR 0x1A
#define | ASM_E500_PERFMON_VECTOR ASM_60X_PERFMON_VECTOR
#define | ASM_E300_CRIT_VECTOR 0x0A
#define | ASM_E300_PERFMON_VECTOR ASM_60X_PERFMON_VECTOR
#define | ASM_E300_IMISS_VECTOR ASM_60X_IMISS_VECTOR /* Special case: Shadowed GPRs */
#define | ASM_E300_DLMISS_VECTOR ASM_60X_DLMISS_VECTOR /* Special case: Shadowed GPRs */
#define | ASM_E300_DSMISS_VECTOR ASM_60X_DSMISS_VECTOR /* Special case: Shadowed GPRs */
#define | ASM_E300_ADDR_VECTOR ASM_60X_ADDR_VECTOR
#define | ASM_E300_SYSMGMT_VECTOR ASM_60X_SYSMGMT_VECTOR
#define | LAST_VALID_EXC 0x1F
#define | ASM_60X_VEC_VECTOR_OFFSET 0xf20
#define | ASM_PPC405_FIT_VECTOR_OFFSET 0x1010
#define | ASM_PPC405_WDOG_VECTOR_OFFSET 0x1020
#define | ASM_PPC405_TRACE_VECTOR_OFFSET 0x2000

## Typedefs
typedef void(* | exception_handler_t) (BSP_Exception_frame *)
| Global exception handler type.
typedef uint8_t | ppc_exc_categories[LAST_VALID_EXC+1]
| Categorie set type.
typedef int(* | ppc_exc_handler_t) (BSP_Exception_frame *f, unsigned vector)
| High-level exception handler type.

## Enumerations
enum | ppc_exc_category { PPC_EXC_INVALID = 0 , PPC_EXC_ASYNC = 1 , PPC_EXC_CLASSIC = 2 , PPC_EXC_CLASSIC_ASYNC = PPC_EXC_CLASSIC | PPC_EXC_ASYNC , PPC_EXC_405_CRITICAL = 4 , PPC_EXC_405_CRITICAL_ASYNC = PPC_EXC_405_CRITICAL | PPC_EXC_ASYNC , PPC_EXC_BOOKE_CRITICAL = 6 , PPC_EXC_BOOKE_CRITICAL_ASYNC = PPC_EXC_BOOKE_CRITICAL | PPC_EXC_ASYNC , PPC_EXC_E500_MACHCHK = 8 , PPC_EXC_E500_MACHCHK_ASYNC = PPC_EXC_E500_MACHCHK | PPC_EXC_ASYNC , PPC_EXC_NAKED = 10 }
| Exception categories. More...

## Functions
void | C_exception_handler (BSP_Exception_frame *excPtr)
| Default global exception handler.
void | BSP_printStackTrace (const BSP_Exception_frame *excPtr)
void * | ppc_exc_vector_address (unsigned vector, void *vector_base)
| Returns the entry address of the vector.
const ppc_exc_categories * | ppc_exc_categories_for_cpu (ppc_cpu_id_t cpu)
| Returns the category set for a CPU of type cpu, or `NULL` if there is no category set available for this CPU.
ppc_exc_category | ppc_exc_category_for_vector (const ppc_exc_categories *categories, unsigned vector)
| Returns the category for the vector vector using the category set categories.
rtems_status_code | ppc_exc_make_prologue (unsigned vector, void *vector_base, ppc_exc_category category, uint32_t *prologue, size_t *prologue_size)
| Makes a minimal prologue for the vector vector with the category category.
void | ppc_exc_initialize_with_vector_base (uintptr_t interrupt_stack_begin, void *vector_base)
| Initializes the exception handling.
int | ppc_exc_handler_default (BSP_Exception_frame *f, unsigned int vector)
| Default high-level exception handler.
rtems_status_code | ppc_exc_set_handler (unsigned vector, ppc_exc_handler_t hdl)
| Set high-level exception handler.
ppc_exc_handler_t | ppc_exc_get_handler (unsigned vector)
| Returns the currently active high-level exception handler.
void | ppc_exc_wrapup (BSP_Exception_frame *f)
int | ppc_exc_alignment_handler (BSP_Exception_frame *frame, unsigned excNum)
| Standard aligment handler.

## Variables
uint32_t | ppc_exc_msr_bits
| Bits for MSR update.
uint32_t | ppc_exc_cache_wb_check
| Cache write back check flag.
ppc_exc_handler_t | ppc_exc_handler_table [LAST_VALID_EXC+1]
| High-level exception handler table.
exception_handler_t | globalExceptHdl
| Global exception handler.
uint32_t(* | ppc_exc_get_DAR )(void)
| Function for DAR access.

## Detailed Description

## Typedef Documentation

## ◆ ppc_exc_handler_t

typedef int(* ppc_exc_handler_t) (BSP_Exception_frame *f, unsigned vector)

High-level exception handler type.

Return values

  0 | The exception was handled and normal execution may resume.
  -1 | Reject the exception resulting in a call of the global exception handler.
  other | Reserved, do not use.

## Enumeration Type Documentation

## ◆ ppc_exc_category

enum ppc_exc_category

Exception categories.

Exceptions of different categories use different SRR registers to save the machine state and do different things in the prologue and epilogue.

For now, the CPU descriptions assume this fits into 8 bits.

## Function Documentation

## ◆ ppc_exc_alignment_handler()

int ppc_exc_alignment_handler | ( | BSP_Exception_frame * | frame,
|  | unsigned | excNum
| ) |  |

Standard aligment handler.

Return values

  0 | Performed a dcbz instruction.
  -1 | Otherwise.

## ◆ ppc_exc_handler_default()

int ppc_exc_handler_default | ( | BSP_Exception_frame * | f,
|  | unsigned int | vector
| ) |  |

Default high-level exception handler.

Return values

  -1 | Always.

## ◆ ppc_exc_initialize_with_vector_base()

void ppc_exc_initialize_with_vector_base | ( | uintptr_t | interrupt_stack_begin,
|  | void * | vector_base
| ) |  |

Initializes the exception handling.

See also
  ppc_exc_initialize().

## ◆ ppc_exc_make_prologue()

rtems_status_code ppc_exc_make_prologue | ( | unsigned | vector,
|  | void * | vector_base,
|  | ppc_exc_category | category,
|  | uint32_t * | prologue,
|  | size_t * | prologue_size
| ) |  |

Makes a minimal prologue for the vector vector with the category category.

The minimal prologue will be copied to prologue. Not more than prologue_size bytes will be copied. Returns the actual minimal prologue size in bytes in prologue_size.

Return values

  RTEMS_SUCCESSFUL | Minimal prologue successfully made.
  RTEMS_INVALID_ID | Invalid vector number.
  RTEMS_INVALID_NUMBER | Invalid category.
  RTEMS_INVALID_SIZE | Prologue size to small.

## ◆ ppc_exc_set_handler()

rtems_status_code ppc_exc_set_handler | ( | unsigned | vector,
|  | ppc_exc_handler_t | hdl
| ) |  |

Set high-level exception handler.

Hook C exception handlers.

- handlers for asynchronous exceptions run on the ISR stack with thread-dispatching disabled.
- handlers for synchronous exceptions run on the task stack with thread-dispatching enabled.

If a particular slot is NULL then the traditional 'globalExcHdl' is used.

ppc_exc_set_handler() registers a handler (returning 0 on success, -1 if the vector argument is too big).

It is legal to set a NULL handler. This leads to the globalExcHdl being called if an exception for 'vector' occurs.

Return values

  RTEMS_SUCCESSFUL | Successful operation.
  RTEMS_INVALID_ID | Invalid vector number.
  RTEMS_RESOURCE_IN_USE | Handler table is read-only and handler does not match.

## ◆ ppc_exc_vector_address()

void * ppc_exc_vector_address | ( | unsigned | vector,
|  | void * | vector_base
| ) |  |

Returns the entry address of the vector.

Parameters

  [in] | vector | The vector number.
  [in] | vector_base | The vector table base address.

## Variable Documentation

## ◆ ppc_exc_cache_wb_check

uint32_t ppc_exc_cache_wb_check
| extern

Cache write back check flag.

(See README under CAVEATS). During initialization a check is performed to assert that write-back caching is enabled for memory accesses. If a BSP runs entirely without any caching then it should set this variable to zero prior to initializing exceptions in order to skip the test. NOTE: The code does NOT support mapping memory with cache-attributes other than write-back (unless the entire cache is physically disabled)

## ◆ ppc_exc_get_DAR

uint32_t(* ppc_exc_get_DAR) (void) | ( | void |  | ) |
| extern

Function for DAR access.

CPU support may store the address of a function here that can be used by the default exception handler to obtain fault-address info which is helpful. Unfortunately, the SPR holding this information is not uniform across PPC families so we need assistance from CPU support

## ◆ ppc_exc_msr_bits

uint32_t ppc_exc_msr_bits
| extern

Bits for MSR update.

Bits in MSR that are enabled during execution of exception handlers / ISRs (on classic PPC these are DR/IR/RI [default], on bookE-style CPUs they should be set to 0 during initialization)

By default, the setting of these bits that is in effect when exception handling is initialized is used.