Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 9487
b: refs/heads/master
c: efdc1e2
h: refs/heads/master
i:
  9485: 1f8fd36
  9483: 8f57c72
  9479: aea9be6
  9471: 4661b39
v: v3
  • Loading branch information
David S. Miller committed Sep 29, 2005
1 parent a394c4e commit aca1309
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 46 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5fd29752f09cabff582f65c0ce35518db4c64937
refs/heads/master: efdc1e2083e04cc70721d55803889b346c1a3de2
63 changes: 29 additions & 34 deletions trunk/arch/sparc64/lib/user_fixup.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,61 +11,56 @@

/* Calculating the exact fault address when using
* block loads and stores can be very complicated.
*
* Instead of trying to be clever and handling all
* of the cases, just fix things up simply here.
*/

unsigned long copy_from_user_fixup(void *to, const void __user *from, unsigned long size)
static unsigned long compute_size(unsigned long start, unsigned long size, unsigned long *offset)
{
char *dst = to;
const char __user *src = from;
unsigned long fault_addr = current_thread_info()->fault_address;
unsigned long end = start + size;

while (size) {
if (__get_user(*dst, src))
break;
dst++;
src++;
size--;
if (fault_addr < start || fault_addr >= end) {
*offset = 0;
} else {
*offset = start - fault_addr;
size = end - fault_addr;
}
return size;
}

if (size)
memset(dst, 0, size);
unsigned long copy_from_user_fixup(void *to, const void __user *from, unsigned long size)
{
unsigned long offset;

size = compute_size((unsigned long) from, size, &offset);
if (likely(size))
memset(to + offset, 0, size);

return size;
}

unsigned long copy_to_user_fixup(void __user *to, const void *from, unsigned long size)
{
char __user *dst = to;
const char *src = from;

while (size) {
if (__put_user(*src, dst))
break;
dst++;
src++;
size--;
}
unsigned long offset;

return size;
return compute_size((unsigned long) to, size, &offset);
}

unsigned long copy_in_user_fixup(void __user *to, void __user *from, unsigned long size)
{
char __user *dst = to;
char __user *src = from;
unsigned long fault_addr = current_thread_info()->fault_address;
unsigned long start = (unsigned long) to;
unsigned long end = start + size;

while (size) {
char tmp;
if (fault_addr >= start && fault_addr < end)
return end - fault_addr;

if (__get_user(tmp, src))
break;
if (__put_user(tmp, dst))
break;
dst++;
src++;
size--;
}
start = (unsigned long) from;
end = start + size;
if (fault_addr >= start && fault_addr < end)
return end - fault_addr;

return size;
}
10 changes: 2 additions & 8 deletions trunk/arch/sparc64/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
}

up_read(&mm->mmap_sem);
goto fault_done;
return;

/*
* Something tried to access memory that isn't in our memory map..
Expand All @@ -469,8 +469,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)

handle_kernel_fault:
do_kernel_fault(regs, si_code, fault_code, insn, address);

goto fault_done;
return;

/*
* We ran out of memory, or some other thing happened to us that made
Expand Down Expand Up @@ -501,9 +500,4 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
/* Kernel mode? Handle exceptions or die */
if (regs->tstate & TSTATE_PRIV)
goto handle_kernel_fault;

fault_done:
/* These values are no longer needed, clear them. */
set_thread_fault_code(0);
current_thread_info()->fault_address = 0;
}
6 changes: 3 additions & 3 deletions trunk/include/asm-sparc64/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ copy_from_user(void *to, const void __user *from, unsigned long size)
{
unsigned long ret = ___copy_from_user(to, from, size);

if (ret)
if (unlikely(ret))
ret = copy_from_user_fixup(to, from, size);
return ret;
}
Expand All @@ -267,7 +267,7 @@ copy_to_user(void __user *to, const void *from, unsigned long size)
{
unsigned long ret = ___copy_to_user(to, from, size);

if (ret)
if (unlikely(ret))
ret = copy_to_user_fixup(to, from, size);
return ret;
}
Expand All @@ -283,7 +283,7 @@ copy_in_user(void __user *to, void __user *from, unsigned long size)
{
unsigned long ret = ___copy_in_user(to, from, size);

if (ret)
if (unlikely(ret))
ret = copy_in_user_fixup(to, from, size);
return ret;
}
Expand Down

0 comments on commit aca1309

Please sign in to comment.