Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1608 → Rev 1609

/kernel/trunk/arch/ppc32/include/interrupt.h
37,9 → 37,12
#define IVT_ITEMS (16 + IRQ_COUNT)
#define INT_OFFSET 16
 
#define int_register(it, name, handler) exc_register(((it)+INT_OFFSET),name,handler)
#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,12 → 151,26
.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
163,11 → 177,11
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
186,28 → 200,49
.global exc_external
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
218,18 → 253,32
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
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);
}