Handle unaligned 4-byte loads. While in the neighborhood, remove the

cr.isr sanity check. We actually encounter insanities, which very
likely means that the insanity check itself is insane. Remove an empty
comment while I'm at it.
This commit is contained in:
Marcel Moolenaar 2003-11-03 08:04:04 +00:00
parent 63e69c75fb
commit 2642a8845b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=121933

View file

@ -134,6 +134,13 @@ fixup(struct asm_inst *i, mcontext_t *mc, uint64_t va)
uint64_t postinc;
switch (i->i_op) {
case ASM_OP_LD4:
copyin((void*)va, (void*)&buf.i, 4);
reg = greg_ptr(mc, (int)i->i_oper[1].o_value);
if (reg == NULL)
return (EINVAL);
wrreg(reg, buf.i & 0xffffffffU);
break;
case ASM_OP_LD8:
copyin((void*)va, (void*)&buf.i, 8);
reg = greg_ptr(mc, (int)i->i_oper[1].o_value);
@ -178,19 +185,9 @@ unaligned_fixup(struct trapframe *tf, struct thread *td)
struct asm_bundle bundle;
int error, slot;
/* Sanity checks. */
if (!(tf->tf_special.isr & IA64_ISR_R) ||
(tf->tf_special.isr & (IA64_ISR_W|IA64_ISR_X|IA64_ISR_NA))) {
printf("%s: unexpected cr.isr value\n", __func__);
return (SIGILL);
}
slot = ((tf->tf_special.psr & IA64_PSR_RI) == IA64_PSR_RI_0) ? 0 :
((tf->tf_special.psr & IA64_PSR_RI) == IA64_PSR_RI_1) ? 1 : 2;
/*
*
*/
if (ia64_unaligned_print) {
uprintf("pid %d (%s): unaligned access: va=0x%lx, pc=0x%lx\n",
td->td_proc->p_pid, td->td_proc->p_comm,