signal part 3 (EFAULT)

This commit is contained in:
Tomoki Shirasawa
2014-01-13 10:52:29 +09:00
parent 2a55f3d718
commit 8411f353fe
4 changed files with 123 additions and 19 deletions

View File

@ -18,10 +18,8 @@
typedef unsigned long int __sigset_t;
#define __sigmask(sig) (((__sigset_t) 1) << ((sig) - 1))
# define _SIGSET_NWORDS (1024 / (8 * sizeof (__sigset_t)))
typedef struct {
__sigset_t __val[_SIGSET_NWORDS];
__sigset_t __val[_NSIG_WORDS];
} sigset_t;
#define SIG_BLOCK 0

View File

@ -1749,7 +1749,67 @@ unsigned long virt_to_phys(void *v)
return va - MAP_ST_START;
}
}
void *phys_to_virt(unsigned long p)
{
return (void *)(p + MAP_ST_START);
}
int copy_from_user(struct process *proc, void *dst, const void *src, size_t siz)
{
struct process_vm *vm = proc->vm;
struct vm_range *range;
size_t pos;
size_t wsiz;
unsigned long pgstart = (unsigned long)src;
wsiz = siz + (pgstart & 0x0000000000000fffUL);
pgstart &= 0xfffffffffffff000UL;
if(!pgstart || pgstart >= MAP_KERNEL_START)
return -EFAULT;
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
for(pos = 0; pos < wsiz; pos += 4096, pgstart += 4096){
range = lookup_process_memory_range(vm, pgstart, pgstart+1);
if(range == NULL){
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
return -EFAULT;
}
if((range->flag & VR_PROT_MASK) == VR_PROT_NONE){
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
return -EFAULT;
}
}
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
memcpy(dst, src, siz);
return 0;
}
int copy_to_user(struct process *proc, void *dst, const void *src, size_t siz)
{
struct process_vm *vm = proc->vm;
struct vm_range *range;
size_t pos;
size_t wsiz;
unsigned long pgstart = (unsigned long)dst;
wsiz = siz + (pgstart & 0x0000000000000fffUL);
pgstart &= 0xfffffffffffff000UL;
if(!pgstart || pgstart >= MAP_KERNEL_START)
return -EFAULT;
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
for(pos = 0; pos < wsiz; pos += 4096, pgstart += 4096){
range = lookup_process_memory_range(vm, pgstart, pgstart+1);
if(range == NULL){
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
return -EFAULT;
}
if(((range->flag & VR_PROT_MASK) == VR_PROT_NONE) ||
!(range->flag & VR_PROT_WRITE)){
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
return -EFAULT;
}
}
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
memcpy(dst, src, siz);
return 0;
}