diff options
author | Marcel Moolenaar <marcel@FreeBSD.org> | 2003-10-24 02:33:26 +0000 |
---|---|---|
committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2003-10-24 02:33:26 +0000 |
commit | 5c03a7c7f94c760e3d1d57bccdd0f938902ae184 (patch) | |
tree | ac39cb0e926f41c1a0a6035543a1c4247cffbe64 /sys | |
parent | 3fc58f92dcab9c9f57144443c1014d47b434f322 (diff) | |
download | src-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.c | 25 |
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); } |