7176dd57e5
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
47 lines
1.1 KiB
C
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 */
|