📄 sys_ppc32.c
字号:
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 + -