⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_sparc.c

📁 microwindows移植到S3C44B0的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	down_write(&current->mm->mmap_sem);	if (flags & MREMAP_FIXED) {		if (new_addr < PAGE_OFFSET &&		    new_addr + new_len > -PAGE_OFFSET)			goto out_sem;	} else if (addr < PAGE_OFFSET && addr + new_len > -PAGE_OFFSET) {		unsigned long map_flags = 0;		struct file *file = NULL;		ret = -ENOMEM;		if (!(flags & MREMAP_MAYMOVE))			goto out_sem;		vma = find_vma(current->mm, addr);		if (vma) {			if (vma->vm_flags & VM_SHARED)				map_flags |= MAP_SHARED;			file = vma->vm_file;		}		/* MREMAP_FIXED checked above. */		new_addr = get_unmapped_area(file, addr, new_len,				    vma ? vma->vm_pgoff : 0,				    map_flags);		ret = new_addr;		if (new_addr & ~PAGE_MASK)			goto out_sem;		flags |= MREMAP_FIXED;	}	ret = do_mremap(addr, old_len, new_len, flags, new_addr);out_sem:	up_write(&current->mm->mmap_sem);out:	return ret;       }/* we come to here via sys_nis_syscall so it can setup the regs argument */asmlinkage unsigned longc_sys_nis_syscall (struct pt_regs *regs){	static int count;		/* Don't make the system unusable, if someone goes stuck */	if (count++ > 5)		return -ENOSYS;	printk ("Unimplemented SPARC system call %ld\n",regs->u_regs[1]);#ifdef DEBUG_UNIMP_SYSCALL		show_regs (regs);#endif	return -ENOSYS;}/* #define DEBUG_SPARC_BREAKPOINT */asmlinkage voidsparc_breakpoint (struct pt_regs *regs){	siginfo_t info;	if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {		regs->tpc &= 0xffffffff;		regs->tnpc &= 0xffffffff;	}#ifdef DEBUG_SPARC_BREAKPOINT        printk ("TRAP: Entering kernel PC=%lx, nPC=%lx\n", regs->tpc, regs->tnpc);#endif	info.si_signo = SIGTRAP;	info.si_errno = 0;	info.si_code = TRAP_BRKPT;	info.si_addr = (void *)regs->tpc;	info.si_trapno = 0;	force_sig_info(SIGTRAP, &info, current);#ifdef DEBUG_SPARC_BREAKPOINT	printk ("TRAP: Returning to space: PC=%lx nPC=%lx\n", regs->tpc, regs->tnpc);#endif}extern void check_pending(int signum);asmlinkage int sys_getdomainname(char *name, int len){        int nlen;	int err = -EFAULT; 	down_read(&uts_sem); 		nlen = strlen(system_utsname.domainname) + 1;        if (nlen < len)                len = nlen;	if(len > __NEW_UTS_LEN)		goto done;	if(copy_to_user(name, system_utsname.domainname, len))		goto done;	err = 0;done:	up_read(&uts_sem);	return err;}/* only AP+ systems have sys_aplib */asmlinkage int sys_aplib(void){	return -ENOSYS;}asmlinkage int solaris_syscall(struct pt_regs *regs){	static int count;	regs->tpc = regs->tnpc;	regs->tnpc += 4;	if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {		regs->tpc &= 0xffffffff;		regs->tnpc &= 0xffffffff;	}	if(++count <= 5) {		printk ("For Solaris binary emulation you need solaris module loaded\n");		show_regs (regs);	}	send_sig(SIGSEGV, current, 1);	return -ENOSYS;}#ifndef CONFIG_SUNOS_EMULasmlinkage int sunos_syscall(struct pt_regs *regs){	static int count;	regs->tpc = regs->tnpc;	regs->tnpc += 4;	if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {		regs->tpc &= 0xffffffff;		regs->tnpc &= 0xffffffff;	}	if(++count <= 20)		printk ("SunOS binary emulation not compiled in\n");	force_sig(SIGSEGV, current);	return -ENOSYS;}#endifasmlinkage int sys_utrap_install(utrap_entry_t type, utrap_handler_t new_p,				 utrap_handler_t new_d,				 utrap_handler_t *old_p, utrap_handler_t *old_d){	if (type < UT_INSTRUCTION_EXCEPTION || type > UT_TRAP_INSTRUCTION_31)		return -EINVAL;	if (new_p == (utrap_handler_t)(long)UTH_NOCHANGE) {		if (old_p) {			if (!current->thread.utraps) {				if (put_user(NULL, old_p))					return -EFAULT;			} else {				if (put_user((utrap_handler_t)(current->thread.utraps[type]), old_p))					return -EFAULT;			}		}		if (old_d) {			if (put_user(NULL, old_d))				return -EFAULT;		}		return 0;	}	if (!current->thread.utraps) {		current->thread.utraps =			kmalloc((UT_TRAP_INSTRUCTION_31+1)*sizeof(long), GFP_KERNEL);		if (!current->thread.utraps) return -ENOMEM;		current->thread.utraps[0] = 1;		memset(current->thread.utraps+1, 0, UT_TRAP_INSTRUCTION_31*sizeof(long));	} else {		if ((utrap_handler_t)current->thread.utraps[type] != new_p &&		    current->thread.utraps[0] > 1) {			long *p = current->thread.utraps;			current->thread.utraps =				kmalloc((UT_TRAP_INSTRUCTION_31+1)*sizeof(long),					GFP_KERNEL);			if (!current->thread.utraps) {				current->thread.utraps = p;				return -ENOMEM;			}			p[0]--;			current->thread.utraps[0] = 1;			memcpy(current->thread.utraps+1, p+1,			       UT_TRAP_INSTRUCTION_31*sizeof(long));		}	}	if (old_p) {		if (put_user((utrap_handler_t)(current->thread.utraps[type]), old_p))			return -EFAULT;	}	if (old_d) {		if (put_user(NULL, old_d))			return -EFAULT;	}	current->thread.utraps[type] = (long)new_p;	return 0;}long sparc_memory_ordering(unsigned long model, struct pt_regs *regs){	if (model >= 3)		return -EINVAL;	regs->tstate = (regs->tstate & ~TSTATE_MM) | (model << 14);	return 0;}asmlinkage intsys_rt_sigaction(int sig, const struct sigaction *act, struct sigaction *oact,		 void *restorer, size_t sigsetsize){	struct k_sigaction new_ka, old_ka;	int ret;	/* XXX: Don't preclude handling different sized sigset_t's.  */	if (sigsetsize != sizeof(sigset_t))		return -EINVAL;	if (act) {		new_ka.ka_restorer = restorer;		if (copy_from_user(&new_ka.sa, act, sizeof(*act)))			return -EFAULT;	}	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);	if (!ret && oact) {		if (copy_to_user(oact, &old_ka.sa, sizeof(*oact)))			return -EFAULT;	}	return ret;}/* Invoked by rtrap code to update performance counters in * user space. */asmlinkage voidupdate_perfctrs(void){	unsigned long pic, tmp;	read_pic(pic);	tmp = (current->thread.kernel_cntd0 += (unsigned int)pic);	__put_user(tmp, current->thread.user_cntd0);	tmp = (current->thread.kernel_cntd1 += (pic >> 32));	__put_user(tmp, current->thread.user_cntd1);	reset_pic();}asmlinkage intsys_perfctr(int opcode, unsigned long arg0, unsigned long arg1, unsigned long arg2){	int err = 0;	switch(opcode) {	case PERFCTR_ON:		current->thread.pcr_reg = arg2;		current->thread.user_cntd0 = (u64 *) arg0;		current->thread.user_cntd1 = (u64 *) arg1;		current->thread.kernel_cntd0 =			current->thread.kernel_cntd1 = 0;		write_pcr(arg2);		reset_pic();		current->thread.flags |= SPARC_FLAG_PERFCTR;		break;	case PERFCTR_OFF:		err = -EINVAL;		if ((current->thread.flags & SPARC_FLAG_PERFCTR) != 0) {			current->thread.user_cntd0 =				current->thread.user_cntd1 = NULL;			current->thread.pcr_reg = 0;			write_pcr(0);			current->thread.flags &= ~(SPARC_FLAG_PERFCTR);			err = 0;		}		break;	case PERFCTR_READ: {		unsigned long pic, tmp;		if (!(current->thread.flags & SPARC_FLAG_PERFCTR)) {			err = -EINVAL;			break;		}		read_pic(pic);		tmp = (current->thread.kernel_cntd0 += (unsigned int)pic);		err |= __put_user(tmp, current->thread.user_cntd0);		tmp = (current->thread.kernel_cntd1 += (pic >> 32));		err |= __put_user(tmp, current->thread.user_cntd1);		reset_pic();		break;	}	case PERFCTR_CLRPIC:		if (!(current->thread.flags & SPARC_FLAG_PERFCTR)) {			err = -EINVAL;			break;		}		current->thread.kernel_cntd0 =			current->thread.kernel_cntd1 = 0;		reset_pic();		break;	case PERFCTR_SETPCR: {		u64 *user_pcr = (u64 *)arg0;		if (!(current->thread.flags & SPARC_FLAG_PERFCTR)) {			err = -EINVAL;			break;		}		err |= __get_user(current->thread.pcr_reg, user_pcr);		write_pcr(current->thread.pcr_reg);		current->thread.kernel_cntd0 =			current->thread.kernel_cntd1 = 0;		reset_pic();		break;	}	case PERFCTR_GETPCR: {		u64 *user_pcr = (u64 *)arg0;		if (!(current->thread.flags & SPARC_FLAG_PERFCTR)) {			err = -EINVAL;			break;		}		err |= __put_user(current->thread.pcr_reg, user_pcr);		break;	}	default:		err = -EINVAL;		break;	};	return err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -