65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2003 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
 | |
|  * Copyright 2003 PathScale, Inc.
 | |
|  *
 | |
|  * Licensed under the GPL
 | |
|  */
 | |
| 
 | |
| #include <linux/sched.h>
 | |
| #include <linux/sched/mm.h>
 | |
| #include <linux/syscalls.h>
 | |
| #include <linux/uaccess.h>
 | |
| #include <asm/prctl.h> /* XXX This should get the constants from libc */
 | |
| #include <registers.h>
 | |
| #include <os.h>
 | |
| 
 | |
| long arch_prctl(struct task_struct *task, int option,
 | |
| 		unsigned long __user *arg2)
 | |
| {
 | |
| 	long ret = -EINVAL;
 | |
| 
 | |
| 	switch (option) {
 | |
| 	case ARCH_SET_FS:
 | |
| 		current->thread.regs.regs.gp[FS_BASE / sizeof(unsigned long)] =
 | |
| 			(unsigned long) arg2;
 | |
| 		ret = 0;
 | |
| 		break;
 | |
| 	case ARCH_SET_GS:
 | |
| 		current->thread.regs.regs.gp[GS_BASE / sizeof(unsigned long)] =
 | |
| 			(unsigned long) arg2;
 | |
| 		ret = 0;
 | |
| 		break;
 | |
| 	case ARCH_GET_FS:
 | |
| 		ret = put_user(current->thread.regs.regs.gp[FS_BASE / sizeof(unsigned long)], arg2);
 | |
| 		break;
 | |
| 	case ARCH_GET_GS:
 | |
| 		ret = put_user(current->thread.regs.regs.gp[GS_BASE / sizeof(unsigned long)], arg2);
 | |
| 		break;
 | |
| 	}
 | |
| 
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)
 | |
| {
 | |
| 	return arch_prctl(current, option, (unsigned long __user *) arg2);
 | |
| }
 | |
| 
 | |
| void arch_switch_to(struct task_struct *to)
 | |
| {
 | |
| 	/*
 | |
| 	 * Nothing needs to be done on x86_64.
 | |
| 	 * The FS_BASE/GS_BASE registers are saved in the ptrace register set.
 | |
| 	 */
 | |
| }
 | |
| 
 | |
| SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
 | |
| 		unsigned long, prot, unsigned long, flags,
 | |
| 		unsigned long, fd, unsigned long, off)
 | |
| {
 | |
| 	if (off & ~PAGE_MASK)
 | |
| 		return -EINVAL;
 | |
| 
 | |
| 	return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
 | |
| }
 |