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

📄 sys_ppc32.c

📁 microwindows移植到S3C44B0的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		break;	/* This one is unimplemented, be we're ready for it. */	case NFSCTL_UGIDUPDATE:		err = nfs_uud32_trans(karg, arg32);		break;	case NFSCTL_GETFH:		err = nfs_getfh32_trans(karg, arg32);		break;	case NFSCTL_GETFD:		err = nfs_getfd32_trans(karg, arg32);		break;	case NFSCTL_GETFS:		err = nfs_getfs32_trans(karg, arg32);		break;	default:		err = -EINVAL;		break;	}	if(err)		goto done;	oldfs = get_fs();	set_fs(KERNEL_DS);	err = sys_nfsservctl(cmd, karg, kres);	set_fs(oldfs);	if (err)		goto done;	if((cmd == NFSCTL_GETFH) ||	   (cmd == NFSCTL_GETFD) ||	   (cmd == NFSCTL_GETFS))		err = nfs_getfh32_res_trans(kres, res32);done:	if(karg) {		if(cmd == NFSCTL_UGIDUPDATE) {			if(karg->ca_umap.ug_ident)				kfree(karg->ca_umap.ug_ident);			if(karg->ca_umap.ug_udimap)				kfree(karg->ca_umap.ug_udimap);			if(karg->ca_umap.ug_gdimap)				kfree(karg->ca_umap.ug_gdimap);		}		kfree(karg);	}	if(kres)		kfree(kres);	return err;}struct timespec32 {	s32    tv_sec;	s32    tv_nsec;};extern asmlinkage long sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp);asmlinkage long sys32_nanosleep(struct timespec32 *rqtp, struct timespec32 *rmtp){	struct timespec t;	int ret;	mm_segment_t old_fs = get_fs ();		PPCDBG(PPCDBG_SYS32NI, "sys32_nanosleep - running - pid=%ld, comm=%s \n", current->pid, current->comm);		if (get_user (t.tv_sec, &rqtp->tv_sec) ||	    __get_user (t.tv_nsec, &rqtp->tv_nsec))		return -EFAULT;	set_fs (KERNEL_DS);	ret = sys_nanosleep(&t, rmtp ? &t : NULL);	set_fs (old_fs);	if (rmtp && ret == -EINTR) {		if (__put_user (t.tv_sec, &rmtp->tv_sec) ||	    	    __put_user (t.tv_nsec, &rmtp->tv_nsec))			return -EFAULT;	}		return ret;}/* These are here just in case some old sparc32 binary calls it. */asmlinkage long sys32_pause(void){		PPCDBG(PPCDBG_SYS32, "sys32_pause - running - pid=%ld, comm=%s \n", current->pid, current->comm);	current->state = TASK_INTERRUPTIBLE;	schedule();		return -ERESTARTNOHAND;}static inline long get_it32(struct itimerval *o, struct itimerval32 *i){	return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||		(__get_user(o->it_interval.tv_sec, &i->it_interval.tv_sec) |		 __get_user(o->it_interval.tv_usec, &i->it_interval.tv_usec) |		 __get_user(o->it_value.tv_sec, &i->it_value.tv_sec) |		 __get_user(o->it_value.tv_usec, &i->it_value.tv_usec)));}static inline long put_it32(struct itimerval32 *o, struct itimerval *i){	return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||		(__put_user(i->it_interval.tv_sec, &o->it_interval.tv_sec) |		 __put_user(i->it_interval.tv_usec, &o->it_interval.tv_usec) |		 __put_user(i->it_value.tv_sec, &o->it_value.tv_sec) |		 __put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));}static inline long get_tv32(struct timeval *o, struct timeval32 *i){	return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||		(__get_user(o->tv_sec, &i->tv_sec) |		 __get_user(o->tv_usec, &i->tv_usec)));}static inline long put_tv32(struct timeval32 *o, struct timeval *i){	return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||		(__put_user(i->tv_sec, &o->tv_sec) |		 __put_user(i->tv_usec, &o->tv_usec)));}extern int do_getitimer(int which, struct itimerval *value);/* Note: it is necessary to treat which as an unsigned int,  * with the corresponding cast to a signed int to insure that the  * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) * and the register representation of a signed int (msr in 64-bit mode) is performed. */asmlinkage long sys32_getitimer(u32 which, struct itimerval32 *it){	struct itimerval kit;	int error;		PPCDBG(PPCDBG_SYS32, "sys32_getitimer - entered - pid=%ld current=%lx comm=%s \n", current->pid, current, current->comm);	error = do_getitimer((int)which, &kit);	if (!error && put_it32(it, &kit))		error = -EFAULT;		PPCDBG(PPCDBG_SYS32, "sys32_getitimer - exited - pid=%ld current=%lx comm=%s\n", current->pid, current, current->comm);	return error;}extern int do_setitimer(int which, struct itimerval *, struct itimerval *);/* Note: it is necessary to treat which as an unsigned int,  * with the corresponding cast to a signed int to insure that the  * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) * and the register representation of a signed int (msr in 64-bit mode) is performed. */asmlinkage long sys32_setitimer(u32 which, struct itimerval32 *in, struct itimerval32 *out){	struct itimerval kin, kout;	int error;		PPCDBG(PPCDBG_SYS32, "sys32_setitimer - entered - pid=%ld current=%lx comm=%s\n", current->pid, current, current->comm);	if (in) {		if (get_it32(&kin, in))			return -EFAULT;	} else		memset(&kin, 0, sizeof(kin));	error = do_setitimer((int)which, &kin, out ? &kout : NULL);	if (error || !out)		return error;	if (put_it32(out, &kout))		return -EFAULT;		PPCDBG(PPCDBG_SYS32, "sys32_setitimer - exited - pid=%ld current=%lx comm=%s\n", current->pid, current, current->comm);	return 0;}#define RLIM_INFINITY32	0xffffffff#define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x)struct rlimit32 {	u32	rlim_cur;	u32	rlim_max;};extern asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit *rlim);asmlinkage long sys32_getrlimit(unsigned int resource, struct rlimit32 *rlim){	struct rlimit r;	int ret;	mm_segment_t old_fs = get_fs();		set_fs (KERNEL_DS);	ret = sys_getrlimit(resource, &r);	set_fs(old_fs);	if (!ret) {		ret = put_user(RESOURCE32(r.rlim_cur), &rlim->rlim_cur);		ret |= __put_user(RESOURCE32(r.rlim_max), &rlim->rlim_max);	}		return ret;}/* Back compatibility for getrlimit. Needed for some apps. */asmlinkage long sys32_old_getrlimit(unsigned int resource, struct rlimit32* rlim){	struct rlimit   x;    // 64-bit version of the resource limits.	struct rlimit32 x32;  // 32-bit version of the resource limits.	long rc = 0;		if (resource >= RLIM_NLIMITS) {		PPCDBG(PPCDBG_SYS32, "sys32_old_getrlimit - specified resource is too large (%x) - pid=%ld, comm=%s\n", resource, current->pid, current->comm);		return -EINVAL;	}	memcpy(&x, current->rlim+resource, sizeof(struct rlimit));	if(x.rlim_cur > RLIM_INFINITY32)		x32.rlim_cur = RLIM_INFINITY32;	else		x32.rlim_cur = x.rlim_cur;	if(x.rlim_max > RLIM_INFINITY32)		x32.rlim_max = RLIM_INFINITY32;	else		x32.rlim_max = x.rlim_max;	rc = (copy_to_user(rlim, &x32, sizeof(x32))) ? (-EFAULT) : 0;	if (rc == 0) {		PPCDBG(PPCDBG_SYS32, "sys32_old_getrlimit - current=%x, maximum=%x - pid=%ld, comm=%s\n", x32.rlim_cur, x32.rlim_max, current->pid, current->comm);	} else {		PPCDBG(PPCDBG_SYS32, "sys32_old_getrlimit - unable to copy into user's storage - pid=%ld, comm=%s\n", current->pid, current->comm);	}	return rc;}extern asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit *rlim);asmlinkage long sys32_setrlimit(unsigned int resource, struct rlimit32 *rlim){	struct rlimit r;	long ret;	mm_segment_t old_fs = get_fs ();		PPCDBG(PPCDBG_SYS32, "sys32_setrlimit - entered - resource=%x, rlim=%p - pid=%ld, comm=%s\n", resource, rlim, current->pid, current->comm);	if (resource >= RLIM_NLIMITS) return -EINVAL;		if (get_user (r.rlim_cur, &rlim->rlim_cur) ||	    __get_user (r.rlim_max, &rlim->rlim_max))		return -EFAULT;	if (r.rlim_cur >= RLIM_INFINITY32)		r.rlim_cur = RLIM_INFINITY;	if (r.rlim_max >= RLIM_INFINITY32)		r.rlim_max = RLIM_INFINITY;	set_fs (KERNEL_DS);	ret = sys_setrlimit(resource, &r);	set_fs (old_fs);		PPCDBG(PPCDBG_SYS32, "sys32_setrlimit - exited w/ ret=%x - pid=%ld, comm=%s\n", ret, current->pid, current->comm);	return ret;}struct rusage32 {        struct timeval32 ru_utime;        struct timeval32 ru_stime;        s32    ru_maxrss;        s32    ru_ixrss;        s32    ru_idrss;        s32    ru_isrss;        s32    ru_minflt;        s32    ru_majflt;        s32    ru_nswap;        s32    ru_inblock;        s32    ru_oublock;        s32    ru_msgsnd;         s32    ru_msgrcv;         s32    ru_nsignals;        s32    ru_nvcsw;        s32    ru_nivcsw;};static int put_rusage (struct rusage32 *ru, struct rusage *r){	int err;		err = put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec);	err |= __put_user (r->ru_utime.tv_usec, &ru->ru_utime.tv_usec);	err |= __put_user (r->ru_stime.tv_sec, &ru->ru_stime.tv_sec);	err |= __put_user (r->ru_stime.tv_usec, &ru->ru_stime.tv_usec);	err |= __put_user (r->ru_maxrss, &ru->ru_maxrss);	err |= __put_user (r->ru_ixrss, &ru->ru_ixrss);	err |= __put_user (r->ru_idrss, &ru->ru_idrss);	err |= __put_user (r->ru_isrss, &ru->ru_isrss);	err |= __put_user (r->ru_minflt, &ru->ru_minflt);	err |= __put_user (r->ru_majflt, &ru->ru_majflt);	err |= __put_user (r->ru_nswap, &ru->ru_nswap);	err |= __put_user (r->ru_inblock, &ru->ru_inblock);	err |= __put_user (r->ru_oublock, &ru->ru_oublock);	err |= __put_user (r->ru_msgsnd, &ru->ru_msgsnd);	err |= __put_user (r->ru_msgrcv, &ru->ru_msgrcv);	err |= __put_user (r->ru_nsignals, &ru->ru_nsignals);	err |= __put_user (r->ru_nvcsw, &ru->ru_nvcsw);	err |= __put_user (r->ru_nivcsw, &ru->ru_nivcsw);	return err;}extern asmlinkage long sys_getrusage(int who, struct rusage *ru);/* Note: it is necessary to treat who as an unsigned int,  * with the corresponding cast to a signed int to insure that the  * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) * and the register representation of a signed int (msr in 64-bit mode) is performed. */asmlinkage long sys32_getrusage(u32 who, struct rusage32 *ru){	struct rusage r;	int ret;	mm_segment_t old_fs = get_fs();		PPCDBG(PPCDBG_SYS32X, "sys32_getrusage - running - pid=%ld, comm=%s\n", current->pid, current->comm);			set_fs (KERNEL_DS);	ret = sys_getrusage((int)who, &r);	set_fs (old_fs);	if (put_rusage (ru, &r)) 		return -EFAULT;	return ret;}struct sysinfo32 {        s32 uptime;        u32 loads[3];        u32 totalram;        u32 freeram;        u32 sharedram;        u32 bufferram;        u32 totalswap;        u32 freeswap;        unsigned short procs;        char _f[22];};extern asmlinkage long sys_sysinfo(struct sysinfo *info);asmlinkage long sys32_sysinfo(struct sysinfo32 *info){	struct sysinfo s;	int ret, err;	mm_segment_t old_fs = get_fs ();		PPCDBG(PPCDBG_SYS32, "sys32_sysinfo - entered - pid=%ld current=%lx comm=%s \n", current->pid, current, current->comm);		set_fs (KERNEL_DS);	ret = sys_sysinfo(&s);	set_fs (old_fs);	err = put_user (s.uptime, &info->uptime);	err |= __put_user (s.loads[0], &info->loads[0]);	err |= __put_user (s.loads[1], &info->loads[1]);	err |= __put_user (s.loads[2], &info->loads[2]);	err |= __put_user (s.totalram, &info->totalram);	err |= __put_user (s.freeram, &info->freeram);	err |= __put_user (s.sharedram, &info->sharedram);	err |= __put_user (s.bufferram, &info->bufferram);	err |= __put_user (s.totalswap, &info->totalswap);	err |= __put_user (s.freeswap, &info->freeswap);	err |= __put_user (s.procs, &info->procs);	if (err)		return -EFAULT;		PPCDBG(PPCDBG_SYS32, "sys32_sysinfo - exited - pid=%ld current=%lx comm=%s \n", current->pid, current, current->comm);	return ret;}/* Translations due to time_t size differences.  Which affects all   sorts of things, like timeval and itimerval.  */extern struct timezone sys_tz;extern int do_sys_settimeofday(struct timeval *tv, struct timezone *tz);asmlinkage long sys32_gettimeofday(struct timeval32 *tv, struct timezone *tz){		PPCDBG(PPCDBG_SYS32X, "sys32_gettimeofday - running - pid=%ld, comm=%s\n", current->pid, current->comm);	if (tv) {		struct timeval ktv;		do_gettimeofday(&ktv);		if (put_tv32(tv, &ktv))			return -EFAULT;	}	if (tz) {		if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))			return -EFAULT;	}		return 0;}asmlinkage long sys32_settimeofday(struct timeval32 *tv, struct timezone *tz){	struct timeval ktv;	struct timezone ktz;		PPCDBG(PPCDBG_SYS32, "sys32_settimeofday - running - pid=%ld current=%lx comm=%s \n", current->pid, current, current->comm); 	if (tv) {		if (get_tv32(&ktv, tv))			return -EFAULT;	}	if (tz) {		if (copy_from_user(&ktz, tz, sizeof(ktz)))			return -EFAULT;	}	return do_sys_settimeofday(tv ? &ktv : NULL, tz ? &ktz : NULL);}struct tms32 {	__kernel_clock_t32 tms_utime;	__kernel_clock_t32 tms_stime;	__kernel_clock_t32 tms_cutime;	__kernel_clock_t32 tms_cstime;};                                extern asmlinkage long sys_times(struct tms * tbuf);asmlinkage long sys32_times(struct tms32 *tbuf){	struct tms t;	long ret;	mm_segment_t old_fs = get_fs ();	int err;		PPCDBG(PPCDBG_SYS32, "sys32_times - entered - pid=%ld current=%lx comm=%s \n", current->pid, current, current->comm);		set_fs (KERNEL_DS);	ret = sys_times(tbuf ? &t : NULL);	set_fs (old_fs);	if (tbuf) {		err = put_user (t.tms_utime, &tbuf->tms_utime);		err |= __put_user (t.tms_stime, &tbuf->tms_stime);		err |= __put_user (t.tms_cutime, &tbuf->tms_cutime);		err |= __put_user (t.tms_cstime, &tbuf->tms_cstime);		if (err)			ret = -EFAULT;	}		PPCDBG(PPCDBG_SYS32, "sys32_times - exited - pid=%ld current=%lx comm=%s \n", current->pid, current, current->comm);	return ret;}struct msgbuf32 { s32 mtype; char mtext[1]; };struct semid_ds32 {	struct ipc_perm sem_perm;	__kernel_time_t32 sem_otime;	__kernel_time_t32 sem_ctime;	u32 sem_base;	u32 sem_pending;	u32 sem_pending_last;	u32 undo;	unsigned short sem_nsems;};struct semid64_ds32 {	struct ipc64_perm sem_perm;	unsigned int __unused1;	__kernel_time_t32 sem_otime;	unsigned int __unused2;	__kernel_time_t32 sem_ctime;	u32 sem_nsems;	u32 __unused3;	u32 __unused4;};struct msqid_ds3

⌨️ 快捷键说明

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