Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 957 → Rev 958

/kernel/trunk/arch/ia64/src/mm/tlb.c
442,15 → 442,15
/** Instruction TLB fault handler for faults with VHPT turned off.
*
* @param vector Interruption vector.
* @param pstate Structure with saved interruption state.
* @param istate Structure with saved interruption state.
*/
void alternate_instruction_tlb_fault(__u64 vector, struct exception_regdump *pstate)
void alternate_instruction_tlb_fault(__u64 vector, istate_t *istate)
{
region_register rr;
__address va;
pte_t *t;
va = pstate->cr_ifa; /* faulting address */
va = istate->cr_ifa; /* faulting address */
t = page_mapping_find(AS, va);
if (t) {
/*
463,7 → 463,7
* Forward the page fault to address space page fault handler.
*/
if (!as_page_fault(va)) {
panic("%s: va=%P, rid=%d\n", __FUNCTION__, pstate->cr_ifa, rr.map.rid);
panic("%s: va=%P, rid=%d\n", __FUNCTION__, istate->cr_ifa, rr.map.rid);
}
}
}
471,9 → 471,9
/** Data TLB fault handler for faults with VHPT turned off.
*
* @param vector Interruption vector.
* @param pstate Structure with saved interruption state.
* @param istate Structure with saved interruption state.
*/
void alternate_data_tlb_fault(__u64 vector, struct exception_regdump *pstate)
void alternate_data_tlb_fault(__u64 vector, istate_t *istate)
{
region_register rr;
rid_t rid;
480,7 → 480,7
__address va;
pte_t *t;
va = pstate->cr_ifa; /* faulting address */
va = istate->cr_ifa; /* faulting address */
rr.word = rr_read(VA2VRN(va));
rid = rr.map.rid;
if (RID2ASID(rid) == ASID_KERNEL) {
506,7 → 506,7
* Forward the page fault to address space page fault handler.
*/
if (!as_page_fault(va)) {
panic("%s: va=%P, rid=%d\n", __FUNCTION__, pstate->cr_ifa, rr.map.rid);
panic("%s: va=%P, rid=%d\n", __FUNCTION__, istate->cr_ifa, rr.map.rid);
}
}
}
516,9 → 516,9
* This fault should not occur.
*
* @param vector Interruption vector.
* @param pstate Structure with saved interruption state.
* @param istate Structure with saved interruption state.
*/
void data_nested_tlb_fault(__u64 vector, struct exception_regdump *pstate)
void data_nested_tlb_fault(__u64 vector, istate_t *istate)
{
panic("%s\n", __FUNCTION__);
}
526,13 → 526,13
/** Data Dirty bit fault handler.
*
* @param vector Interruption vector.
* @param pstate Structure with saved interruption state.
* @param istate Structure with saved interruption state.
*/
void data_dirty_bit_fault(__u64 vector, struct exception_regdump *pstate)
void data_dirty_bit_fault(__u64 vector, istate_t *istate)
{
pte_t *t;
 
t = page_mapping_find(AS, pstate->cr_ifa);
t = page_mapping_find(AS, istate->cr_ifa);
ASSERT(t && t->p);
if (t && t->p) {
/*
547,13 → 547,13
/** Instruction access bit fault handler.
*
* @param vector Interruption vector.
* @param pstate Structure with saved interruption state.
* @param istate Structure with saved interruption state.
*/
void instruction_access_bit_fault(__u64 vector, struct exception_regdump *pstate)
void instruction_access_bit_fault(__u64 vector, istate_t *istate)
{
pte_t *t;
 
t = page_mapping_find(AS, pstate->cr_ifa);
t = page_mapping_find(AS, istate->cr_ifa);
ASSERT(t && t->p);
if (t && t->p) {
/*
568,13 → 568,13
/** Data access bit fault handler.
*
* @param vector Interruption vector.
* @param pstate Structure with saved interruption state.
* @param istate Structure with saved interruption state.
*/
void data_access_bit_fault(__u64 vector, struct exception_regdump *pstate)
void data_access_bit_fault(__u64 vector, istate_t *istate)
{
pte_t *t;
 
t = page_mapping_find(AS, pstate->cr_ifa);
t = page_mapping_find(AS, istate->cr_ifa);
ASSERT(t && t->p);
if (t && t->p) {
/*
589,15 → 589,15
/** Page not present fault handler.
*
* @param vector Interruption vector.
* @param pstate Structure with saved interruption state.
* @param istate Structure with saved interruption state.
*/
void page_not_present(__u64 vector, struct exception_regdump *pstate)
void page_not_present(__u64 vector, istate_t *istate)
{
region_register rr;
__address va;
pte_t *t;
va = pstate->cr_ifa; /* faulting address */
va = istate->cr_ifa; /* faulting address */
t = page_mapping_find(AS, va);
ASSERT(t);
612,7 → 612,7
dtc_pte_copy(t);
} else {
if (!as_page_fault(va)) {
panic("%s: va=%P, rid=%d\n", __FUNCTION__, pstate->cr_ifa, rr.map.rid);
panic("%s: va=%P, rid=%d\n", __FUNCTION__, istate->cr_ifa, rr.map.rid);
}
}
}
/kernel/trunk/arch/ia64/src/interrupt.c
108,7 → 108,7
};
 
static char *vector_to_string(__u16 vector);
static void dump_interrupted_context(struct exception_regdump *pstate);
static void dump_interrupted_context(istate_t *istate);
 
char *vector_to_string(__u16 vector)
{
120,33 → 120,33
return vector_names_64_bundle[vector/(64*BUNDLE_SIZE)];
}
 
void dump_interrupted_context(struct exception_regdump *pstate)
void dump_interrupted_context(istate_t *istate)
{
char *ifa, *iipa, *iip;
 
ifa = get_symtab_entry(pstate->cr_ifa);
iipa = get_symtab_entry(pstate->cr_iipa);
iip = get_symtab_entry(pstate->cr_iip);
ifa = get_symtab_entry(istate->cr_ifa);
iipa = get_symtab_entry(istate->cr_iipa);
iip = get_symtab_entry(istate->cr_iip);
 
putchar('\n');
printf("Interrupted context dump:\n");
printf("ar.bsp=%P\tar.bspstore=%P\n", pstate->ar_bsp, pstate->ar_bspstore);
printf("ar.rnat=%Q\tar.rsc=%Q\n", pstate->ar_rnat, pstate->ar_rsc);
printf("ar.ifs=%Q\tar.pfs=%Q\n", pstate->ar_ifs, pstate->ar_pfs);
printf("cr.isr=%Q\tcr.ipsr=%Q\t\n", pstate->cr_isr.value, pstate->cr_ipsr);
printf("ar.bsp=%P\tar.bspstore=%P\n", istate->ar_bsp, istate->ar_bspstore);
printf("ar.rnat=%Q\tar.rsc=%Q\n", istate->ar_rnat, istate->ar_rsc);
printf("ar.ifs=%Q\tar.pfs=%Q\n", istate->ar_ifs, istate->ar_pfs);
printf("cr.isr=%Q\tcr.ipsr=%Q\t\n", istate->cr_isr.value, istate->cr_ipsr);
printf("cr.iip=%Q, #%d\t(%s)\n", pstate->cr_iip, pstate->cr_isr.ei ,iip ? iip : "?");
printf("cr.iipa=%Q\t(%s)\n", pstate->cr_iipa, iipa ? iipa : "?");
printf("cr.ifa=%Q\t(%s)\n", pstate->cr_ifa, ifa ? ifa : "?");
printf("cr.iip=%Q, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei ,iip ? iip : "?");
printf("cr.iipa=%Q\t(%s)\n", istate->cr_iipa, iipa ? iipa : "?");
printf("cr.ifa=%Q\t(%s)\n", istate->cr_ifa, ifa ? ifa : "?");
}
 
void general_exception(__u64 vector, struct exception_regdump *pstate)
void general_exception(__u64 vector, istate_t *istate)
{
char *desc = "";
 
dump_interrupted_context(pstate);
dump_interrupted_context(istate);
 
switch (pstate->cr_isr.ge_code) {
switch (istate->cr_isr.ge_code) {
case GE_ILLEGALOP:
desc = "Illegal Operation fault";
break;
174,33 → 174,33
}
 
/** Handle syscall. */
int break_instruction(__u64 vector, struct exception_regdump *pstate)
int break_instruction(__u64 vector, istate_t *istate)
{
/*
* Move to next instruction after BREAK.
*/
if (pstate->cr_ipsr.ri == 2) {
pstate->cr_ipsr.ri = 0;
pstate->cr_iip += 16;
if (istate->cr_ipsr.ri == 2) {
istate->cr_ipsr.ri = 0;
istate->cr_iip += 16;
} else {
pstate->cr_ipsr.ri++;
istate->cr_ipsr.ri++;
}
 
if (pstate->in0 < SYSCALL_END)
return syscall_table[pstate->in0](pstate->in1, pstate->in2, pstate->in3);
if (istate->in3 < SYSCALL_END)
return syscall_table[istate->in3](istate->in0, istate->in1, istate->in2);
else
panic("Undefined syscall %d", pstate->in0);
panic("Undefined syscall %d", istate->in3);
return -1;
}
 
void universal_handler(__u64 vector, struct exception_regdump *pstate)
void universal_handler(__u64 vector, istate_t *istate)
{
dump_interrupted_context(pstate);
dump_interrupted_context(istate);
panic("Interruption: %W (%s)\n", (__u16) vector, vector_to_string(vector));
}
 
void external_interrupt(__u64 vector, struct exception_regdump *pstate)
void external_interrupt(__u64 vector, istate_t *istate)
{
cr_ivr_t ivr;