Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 83203
b: refs/heads/master
c: 8efa3c9
h: refs/heads/master
i:
  83201: 88aa5c2
  83199: c9fbca1
v: v3
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed Feb 5, 2008
1 parent 3f5d68b commit 5f7e980
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 63 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: 0b4e273fb83bce5dd8e166a4defb16ebdd215abf
refs/heads/master: 8efa3c9d545ab6adc5c5e001cbd7aee60909b3da
1 change: 0 additions & 1 deletion trunk/arch/um/include/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,6 @@ extern void stack_protections(unsigned long address);
extern int raw(int fd);
extern void setup_machinename(char *machine_out);
extern void setup_hostinfo(char *buf, int len);
extern int setjmp_wrapper(void (*proc)(void *, void *), ...);
extern void os_dump_core(void) __attribute__ ((noreturn));

/* time.c */
Expand Down
73 changes: 27 additions & 46 deletions trunk/arch/um/kernel/skas/uaccess.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,10 @@ static pte_t *maybe_map(unsigned long virt, int is_write)
static int do_op_one_page(unsigned long addr, int len, int is_write,
int (*op)(unsigned long addr, int len, void *arg), void *arg)
{
jmp_buf buf;
struct page *page;
pte_t *pte;
int n;
int n, faulted;

pte = maybe_map(addr, is_write);
if (pte == NULL)
Expand All @@ -70,82 +71,62 @@ static int do_op_one_page(unsigned long addr, int len, int is_write,
addr = (unsigned long) kmap_atomic(page, KM_UML_USERCOPY) +
(addr & ~PAGE_MASK);

n = (*op)(addr, len, arg);
current->thread.fault_catcher = &buf;

faulted = UML_SETJMP(&buf);
if (faulted == 0)
n = (*op)(addr, len, arg);
else
n = -1;

current->thread.fault_catcher = NULL;

kunmap_atomic(page, KM_UML_USERCOPY);

return n;
}

static void do_buffer_op(void *jmpbuf, void *arg_ptr)
static int buffer_op(unsigned long addr, int len, int is_write,
int (*op)(unsigned long, int, void *), void *arg)
{
va_list args;
unsigned long addr;
int len, is_write, size, remain, n;
int (*op)(unsigned long, int, void *);
void *arg;
int *res;

va_copy(args, *(va_list *)arg_ptr);
addr = va_arg(args, unsigned long);
len = va_arg(args, int);
is_write = va_arg(args, int);
op = va_arg(args, void *);
arg = va_arg(args, void *);
res = va_arg(args, int *);
va_end(args);
int size, remain, n;

size = min(PAGE_ALIGN(addr) - addr, (unsigned long) len);
remain = len;

current->thread.fault_catcher = jmpbuf;
n = do_op_one_page(addr, size, is_write, op, arg);
if (n != 0) {
*res = (n < 0 ? remain : 0);
remain = (n < 0 ? remain : 0);
goto out;
}

addr += size;
remain -= size;
if (remain == 0) {
*res = 0;
if (remain == 0)
goto out;
}

while(addr < ((addr + remain) & PAGE_MASK)) {
while (addr < ((addr + remain) & PAGE_MASK)) {
n = do_op_one_page(addr, PAGE_SIZE, is_write, op, arg);
if (n != 0) {
*res = (n < 0 ? remain : 0);
remain = (n < 0 ? remain : 0);
goto out;
}

addr += PAGE_SIZE;
remain -= PAGE_SIZE;
}
if (remain == 0) {
*res = 0;
if (remain == 0)
goto out;
}

n = do_op_one_page(addr, remain, is_write, op, arg);
if (n != 0)
*res = (n < 0 ? remain : 0);
else *res = 0;
out:
current->thread.fault_catcher = NULL;
}

static int buffer_op(unsigned long addr, int len, int is_write,
int (*op)(unsigned long addr, int len, void *arg),
void *arg)
{
int faulted, res;

faulted = setjmp_wrapper(do_buffer_op, addr, len, is_write, op, arg,
&res);
if (!faulted)
return res;
if (n != 0) {
remain = (n < 0 ? remain : 0);
goto out;
}

return addr + len - (unsigned long) current->thread.fault_addr;
return 0;
out:
return remain;
}

static int copy_chunk_from_user(unsigned long from, int len, void *arg)
Expand Down
15 changes: 0 additions & 15 deletions trunk/arch/um/os-Linux/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,21 +88,6 @@ void setup_hostinfo(char *buf, int len)
host.release, host.version, host.machine);
}

int setjmp_wrapper(void (*proc)(void *, void *), ...)
{
va_list args;
jmp_buf buf;
int n;

n = UML_SETJMP(&buf);
if(n == 0){
va_start(args, proc);
(*proc)(&buf, &args);
}
va_end(args);
return n;
}

void os_dump_core(void)
{
int pid;
Expand Down

0 comments on commit 5f7e980

Please sign in to comment.