Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/um/kernel/exec.c
10817 views
1
/*
2
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3
* Licensed under the GPL
4
*/
5
6
#include "linux/stddef.h"
7
#include "linux/fs.h"
8
#include "linux/ptrace.h"
9
#include "linux/sched.h"
10
#include "linux/slab.h"
11
#include "asm/current.h"
12
#include "asm/processor.h"
13
#include "asm/uaccess.h"
14
#include "as-layout.h"
15
#include "mem_user.h"
16
#include "skas.h"
17
#include "os.h"
18
#include "internal.h"
19
20
void flush_thread(void)
21
{
22
void *data = NULL;
23
int ret;
24
25
arch_flush_thread(&current->thread.arch);
26
27
ret = unmap(&current->mm->context.id, 0, STUB_START, 0, &data);
28
ret = ret || unmap(&current->mm->context.id, STUB_END,
29
host_task_size - STUB_END, 1, &data);
30
if (ret) {
31
printk(KERN_ERR "flush_thread - clearing address space failed, "
32
"err = %d\n", ret);
33
force_sig(SIGKILL, current);
34
}
35
36
__switch_mm(&current->mm->context.id);
37
}
38
39
void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)
40
{
41
set_fs(USER_DS);
42
PT_REGS_IP(regs) = eip;
43
PT_REGS_SP(regs) = esp;
44
}
45
46
static long execve1(const char *file,
47
const char __user *const __user *argv,
48
const char __user *const __user *env)
49
{
50
long error;
51
52
error = do_execve(file, argv, env, &current->thread.regs);
53
if (error == 0) {
54
task_lock(current);
55
current->ptrace &= ~PT_DTRACE;
56
#ifdef SUBARCH_EXECVE1
57
SUBARCH_EXECVE1(&current->thread.regs.regs);
58
#endif
59
task_unlock(current);
60
}
61
return error;
62
}
63
64
long um_execve(const char *file, const char __user *const __user *argv, const char __user *const __user *env)
65
{
66
long err;
67
68
err = execve1(file, argv, env);
69
if (!err)
70
UML_LONGJMP(current->thread.exec_buf, 1);
71
return err;
72
}
73
74
long sys_execve(const char __user *file, const char __user *const __user *argv,
75
const char __user *const __user *env)
76
{
77
long error;
78
char *filename;
79
80
filename = getname(file);
81
error = PTR_ERR(filename);
82
if (IS_ERR(filename)) goto out;
83
error = execve1(filename, argv, env);
84
putname(filename);
85
out:
86
return error;
87
}
88
89