Subversion Repositories HelenOS

Rev

Rev 2787 | Rev 3424 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2787 Rev 3125
Line 190... Line 190...
190
        fault_if_from_uspace(istate, "Page fault: %#x", badvaddr);
190
        fault_if_from_uspace(istate, "Page fault: %#x", badvaddr);
191
        panic("page fault\n");
191
        panic("page fault\n");
192
    }
192
    }
193
}
193
}
194
 
194
 
-
 
195
/** Check whether the abort was caused by a bkpt instruction.
-
 
196
 *
-
 
197
 * This must be called after (possibly) fetching the faulting page.
-
 
198
 *
-
 
199
 * TODO: When paging-out is implemented, make sure the page
-
 
200
 * is still present when reading the instruction (we don't want
-
 
201
 * to trigger another exception).
-
 
202
 */
-
 
203
static void bkpt_check(istate_t *istate)
-
 
204
{
-
 
205
    uint32_t *instr_addr = (uint32_t *) istate->pc;
-
 
206
    uint32_t opcode = *instr_addr;
-
 
207
 
-
 
208
    if ((opcode & 0xfff000f0) == 0xe1200070) {
-
 
209
        /* Bkpt */
-
 
210
        if (istate_from_uspace(istate)) {
-
 
211
            udebug_breakpoint_event(0);
-
 
212
        } else {
-
 
213
            panic("Unexpected BKPT instruction at 0x%x",
-
 
214
                istate->pc);
-
 
215
        }
-
 
216
    }
-
 
217
}
-
 
218
 
195
/** Handles "prefetch abort" exception (instruction couldn't be executed).
219
/** Handles "prefetch abort" exception (instruction couldn't be executed).
196
 *
220
 *
197
 * @param exc_no    Exception number.
221
 * @param exc_no    Exception number.
198
 * @param istate    CPU state when exception occured.
222
 * @param istate    CPU state when exception occured.
199
 */
223
 */
Line 205... Line 229...
205
        dprintf("prefetch_abort\n");
229
        dprintf("prefetch_abort\n");
206
        print_istate(istate);
230
        print_istate(istate);
207
        panic("page fault - prefetch_abort at address: %x\n",
231
        panic("page fault - prefetch_abort at address: %x\n",
208
            istate->pc);
232
            istate->pc);
209
    }
233
    }
-
 
234
 
-
 
235
    /* Now check if the abort was caused by a breakpoint instruction */
-
 
236
    bkpt_check(istate);
210
}
237
}
211
 
238
 
212
/** @}
239
/** @}
213
 */
240
 */