/kernel/trunk/arch/ppc32/include/interrupt.h |
---|
39,7 → 39,10 |
#define int_register(it, name, handler) exc_register(((it)+INT_OFFSET),name,handler) |
#define VECTOR_DECREMENTER 10 |
#define VECTOR_DATA_STORAGE 2 |
#define VECTOR_INSTRUCTION_STORAGE 3 |
#define VECTOR_EXTERNAL 4 |
#define VECTOR_DECREMENTER 8 |
extern void start_decrementer(void); |
extern void interrupt_init(void); |
/kernel/trunk/arch/ppc32/include/mm/page.h |
---|
143,7 → 143,7 |
unsigned pp : 2; /**< Page protection */ |
} phte_t; |
extern void pht_refill(bool data, istate_t *istate); |
extern void pht_refill(int n, istate_t *istate); |
extern void pht_init(void); |
#endif /* __ASM__ */ |
/kernel/trunk/arch/ppc32/src/exception.S |
---|
151,23 → 151,37 |
.org 0x100 |
.global exc_system_reset |
exc_system_reset: |
b exc_system_reset |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 0 |
b jump_to_kernel |
.org 0x200 |
.global exc_machine_check |
exc_machine_check: |
b exc_machine_check |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 1 |
b jump_to_kernel |
.org 0x300 |
.global exc_data_storage |
exc_data_storage: |
CONTEXT_STORE |
lis r12, pht_refill@ha |
addi r12, r12, pht_refill@l |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 1 |
li r3, 2 |
b jump_to_kernel |
.org 0x400 |
175,11 → 189,11 |
exc_instruction_storage: |
CONTEXT_STORE |
lis r12, pht_refill@ha |
addi r12, r12, pht_refill@l |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 0 |
li r3, 3 |
b jump_to_kernel |
.org 0x500 |
187,28 → 201,49 |
exc_external: |
CONTEXT_STORE |
lis r12, extint_handler@ha |
addi r12, r12, extint_handler@l |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 0 |
li r3, 4 |
b jump_to_kernel |
.org 0x600 |
.global exc_alignment |
exc_alignment: |
b exc_alignment |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 5 |
b jump_to_kernel |
.org 0x700 |
.global exc_program |
exc_program: |
b exc_program |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 6 |
b jump_to_kernel |
.org 0x800 |
.global exc_fp_unavailable |
exc_fp_unavailable: |
b exc_fp_unavailable |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 7 |
b jump_to_kernel |
.org 0x900 |
.global exc_decrementer |
exc_decrementer: |
218,19 → 253,33 |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 10 |
li r3, 8 |
b jump_to_kernel |
.org 0xa00 |
.global exc_reserved0 |
exc_reserved0: |
b exc_reserved0 |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 9 |
b jump_to_kernel |
.org 0xb00 |
.global exc_reserved1 |
exc_reserved1: |
b exc_reserved1 |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 10 |
b jump_to_kernel |
.org 0xc00 |
.global exc_syscall |
exc_syscall: |
241,4 → 290,11 |
.org 0xd00 |
.global exc_trace |
exc_trace: |
b exc_trace |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 12 |
b jump_to_kernel |
/kernel/trunk/arch/ppc32/src/mm/page.c |
---|
30,6 → 30,7 |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <arch/asm.h> |
#include <arch/interrupt.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/as.h> |
187,7 → 188,7 |
* @param istate Interrupted register context. |
* |
*/ |
void pht_refill(bool data, istate_t *istate) |
void pht_refill(int n, istate_t *istate) |
{ |
__address badvaddr; |
pte_t *pte; |
203,7 → 204,7 |
lock = true; |
} |
if (data) { |
if (n == VECTOR_DATA_STORAGE) { |
asm volatile ( |
"mfdar %0\n" |
: "=r" (badvaddr) |
/kernel/trunk/arch/ppc32/src/interrupt.c |
---|
45,6 → 45,18 |
} |
/** Handler of external interrupts */ |
static void exception_external(int n, istate_t *istate) |
{ |
int inum; |
while ((inum = pic_get_pending()) != -1) { |
exc_dispatch(inum + INT_OFFSET, istate); |
pic_ack_interrupt(inum); |
} |
} |
static void exception_decrementer(int n, istate_t *istate) |
{ |
clock(); |
55,24 → 67,21 |
/* Initialize basic tables for exception dispatching */ |
void interrupt_init(void) |
{ |
exc_register(VECTOR_DATA_STORAGE, "data_storage", pht_refill); |
exc_register(VECTOR_INSTRUCTION_STORAGE, "instruction_storage", pht_refill); |
exc_register(VECTOR_EXTERNAL, "external", exception_external); |
exc_register(VECTOR_DECREMENTER, "timer", exception_decrementer); |
} |
/* Reregister irq to be IPC-ready */ |
void irq_ipc_bind_arch(__native irq) |
static void ipc_int(int n, istate_t *istate) |
{ |
panic("not implemented\n"); |
/* TODO */ |
ipc_irq_send_notif(n - INT_OFFSET); |
} |
/** Handler of externul interrupts */ |
void extint_handler(int n, istate_t *istate) |
/* Reregister irq to be IPC-ready */ |
void irq_ipc_bind_arch(__native irq) |
{ |
int inum; |
while ((inum = pic_get_pending()) != -1) { |
exc_dispatch(inum+INT_OFFSET, istate); |
pic_ack_interrupt(inum); |
int_register(irq, "ipc_int", ipc_int); |
} |
} |