aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2003-10-24 02:33:26 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2003-10-24 02:33:26 +0000
commit5c03a7c7f94c760e3d1d57bccdd0f938902ae184 (patch)
treeac39cb0e926f41c1a0a6035543a1c4247cffbe64 /sys
parent3fc58f92dcab9c9f57144443c1014d47b434f322 (diff)
downloadsrc-5c03a7c7f94c760e3d1d57bccdd0f938902ae184.tar.gz
src-5c03a7c7f94c760e3d1d57bccdd0f938902ae184.zip
Don't use fuword() or suword() unconditionally. They explicitly
disallow reading or writing.
Notes
Notes: svn path=/head/; revision=121449
Diffstat (limited to 'sys')
-rw-r--r--sys/ia64/ia64/unaligned.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/sys/ia64/ia64/unaligned.c b/sys/ia64/ia64/unaligned.c
index 41380bdcb72d..04ec2d499207 100644
--- a/sys/ia64/ia64/unaligned.c
+++ b/sys/ia64/ia64/unaligned.c
@@ -106,6 +106,23 @@ greg_ptr(mcontext_t *mc, int gr)
return ((void*)(p + gr));
}
+static uint64_t
+rdreg(uint64_t *addr)
+{
+ if ((uintptr_t)addr < VM_MAX_ADDRESS)
+ return (fuword(addr));
+ return (*addr);
+}
+
+static void
+wrreg(uint64_t *addr, uint64_t val)
+{
+ if ((uintptr_t)addr < VM_MAX_ADDRESS)
+ suword(addr, val);
+ else
+ *addr = val;
+}
+
static int
fixup(struct asm_inst *i, mcontext_t *mc, uint64_t va)
{
@@ -122,7 +139,7 @@ fixup(struct asm_inst *i, mcontext_t *mc, uint64_t va)
reg = greg_ptr(mc, (int)i->i_oper[1].o_value);
if (reg == NULL)
return (EINVAL);
- suword(reg, buf.i);
+ wrreg(reg, buf.i);
break;
case ASM_OP_LDFD:
copyin((void*)va, (void*)&buf.d, 8);
@@ -140,7 +157,7 @@ fixup(struct asm_inst *i, mcontext_t *mc, uint64_t va)
reg = greg_ptr(mc, (int)i->i_oper[3].o_value);
if (reg == NULL)
return (EINVAL);
- postinc = fuword(reg);
+ postinc = rdreg(reg);
} else
postinc = (i->i_oper[3].o_type == ASM_OPER_IMM)
? i->i_oper[3].o_value : 0;
@@ -148,8 +165,8 @@ fixup(struct asm_inst *i, mcontext_t *mc, uint64_t va)
reg = greg_ptr(mc, (int)i->i_oper[3].o_value);
if (reg == NULL)
return (EINVAL);
- postinc += fuword(reg);
- suword(reg, postinc);
+ postinc += rdreg(reg);
+ wrreg(reg, postinc);
}
return (0);
}