haiku/headers/private/kernel/arch/ppc/arch_int.h
Ingo Weinhold 7176dd57e5 Reworked the exception handling code. The former one ran into the
void after turning off BAT for the segment containing itself.
The monster macro for the exception vector code was not really
elegant besides being too long for the 32 byte performance
monitor exception slot. Furthermore wasting three of the SPRG*
registers as cheap scratch memory wasn't that nice either.

We now have a three-step approach: The exception vectors
themselves contain only five instructions which branch to common
code at the beginning of the same physical page. That one sets
up BAT for itself, turns address translation back on and jumps
into the kernel. There we turn off BAT again, dump an iframe,
and enter the actual exception handler (/dispatcher). Upon return
the registers are restored from the iframe and we get back to the
place where the exception occurred.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15881 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-01-09 03:30:52 +00:00

47 lines
1.1 KiB
C

/*
* Copyright 2005-2006, Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Axel Dörfler <axeld@pinc-software.de>
* Ingo Weinhold <bonefish@cs.tu-berlin.de>
*/
#ifndef _KERNEL_ARCH_PPC_INT_H
#define _KERNEL_ARCH_PPC_INT_H
#include <SupportDefs.h>
#define NUM_IO_VECTORS 256
/* The sprg0 register of each CPU points to the physical address of such
a structure. So it is at hand in the early exception handling code.
*/
struct ppc_cpu_exception_context {
void *kernel_handle_exception; // exception handler routine in the
// kernel
void *exception_context; // the virtual address of this
// structure
void *kernel_stack; // kernel stack for the current thread
uint32 scratch[8]; // scratch memory for free use in the
// early exception handling code
};
#ifdef __cplusplus
extern "C" {
#endif
struct ppc_cpu_exception_context *ppc_get_cpu_exception_context(int cpu);
void ppc_set_current_cpu_exception_context(
struct ppc_cpu_exception_context *context);
// only called once per CPU
#ifdef __cplusplus
}
#endif
#endif /* _KERNEL_ARCH_PPC_INT_H */