Merge branch 'work.regset' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull ptrace regset updates from Al Viro: "Internal regset API changes: - regularize copy_regset_{to,from}_user() callers - switch to saner calling conventions for ->get() - kill user_regset_copyout() The ->put() side of things will have to wait for the next cycle, unfortunately. The balance is about -1KLoC and replacements for ->get() instances are a lot saner" * 'work.regset' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (41 commits) regset: kill user_regset_copyout{,_zero}() regset(): kill ->get_size() regset: kill ->get() csky: switch to ->regset_get() xtensa: switch to ->regset_get() parisc: switch to ->regset_get() nds32: switch to ->regset_get() nios2: switch to ->regset_get() hexagon: switch to ->regset_get() h8300: switch to ->regset_get() openrisc: switch to ->regset_get() riscv: switch to ->regset_get() c6x: switch to ->regset_get() ia64: switch to ->regset_get() arc: switch to ->regset_get() arm: switch to ->regset_get() sh: convert to ->regset_get() arm64: switch to ->regset_get() mips: switch to ->regset_get() sparc: switch to ->regset_get() ...
This commit is contained in:
@@ -945,28 +945,14 @@ asmlinkage void do_syscall_trace_exit(struct pt_regs *regs)
|
||||
|
||||
static int s390_regs_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
unsigned pos;
|
||||
if (target == current)
|
||||
save_access_regs(target->thread.acrs);
|
||||
|
||||
if (kbuf) {
|
||||
unsigned long *k = kbuf;
|
||||
while (count > 0) {
|
||||
*k++ = __peek_user(target, pos);
|
||||
count -= sizeof(*k);
|
||||
pos += sizeof(*k);
|
||||
}
|
||||
} else {
|
||||
unsigned long __user *u = ubuf;
|
||||
while (count > 0) {
|
||||
if (__put_user(__peek_user(target, pos), u++))
|
||||
return -EFAULT;
|
||||
count -= sizeof(*u);
|
||||
pos += sizeof(*u);
|
||||
}
|
||||
}
|
||||
for (pos = 0; pos < sizeof(s390_regs); pos += sizeof(long))
|
||||
membuf_store(&to, __peek_user(target, pos));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1007,8 +993,8 @@ static int s390_regs_set(struct task_struct *target,
|
||||
}
|
||||
|
||||
static int s390_fpregs_get(struct task_struct *target,
|
||||
const struct user_regset *regset, unsigned int pos,
|
||||
unsigned int count, void *kbuf, void __user *ubuf)
|
||||
const struct user_regset *regset,
|
||||
struct membuf to)
|
||||
{
|
||||
_s390_fp_regs fp_regs;
|
||||
|
||||
@@ -1018,8 +1004,7 @@ static int s390_fpregs_get(struct task_struct *target,
|
||||
fp_regs.fpc = target->thread.fpu.fpc;
|
||||
fpregs_store(&fp_regs, &target->thread.fpu);
|
||||
|
||||
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||
&fp_regs, 0, -1);
|
||||
return membuf_write(&to, &fp_regs, sizeof(fp_regs));
|
||||
}
|
||||
|
||||
static int s390_fpregs_set(struct task_struct *target,
|
||||
@@ -1066,20 +1051,9 @@ static int s390_fpregs_set(struct task_struct *target,
|
||||
|
||||
static int s390_last_break_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
if (count > 0) {
|
||||
if (kbuf) {
|
||||
unsigned long *k = kbuf;
|
||||
*k = target->thread.last_break;
|
||||
} else {
|
||||
unsigned long __user *u = ubuf;
|
||||
if (__put_user(target->thread.last_break, u))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return membuf_store(&to, target->thread.last_break);
|
||||
}
|
||||
|
||||
static int s390_last_break_set(struct task_struct *target,
|
||||
@@ -1092,16 +1066,13 @@ static int s390_last_break_set(struct task_struct *target,
|
||||
|
||||
static int s390_tdb_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(target);
|
||||
unsigned char *data;
|
||||
|
||||
if (!(regs->int_code & 0x200))
|
||||
return -ENODATA;
|
||||
data = target->thread.trap_tdb;
|
||||
return user_regset_copyout(&pos, &count, &kbuf, &ubuf, data, 0, 256);
|
||||
return membuf_write(&to, target->thread.trap_tdb, 256);
|
||||
}
|
||||
|
||||
static int s390_tdb_set(struct task_struct *target,
|
||||
@@ -1114,8 +1085,7 @@ static int s390_tdb_set(struct task_struct *target,
|
||||
|
||||
static int s390_vxrs_low_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
__u64 vxrs[__NUM_VXRS_LOW];
|
||||
int i;
|
||||
@@ -1126,7 +1096,7 @@ static int s390_vxrs_low_get(struct task_struct *target,
|
||||
save_fpu_regs();
|
||||
for (i = 0; i < __NUM_VXRS_LOW; i++)
|
||||
vxrs[i] = *((__u64 *)(target->thread.fpu.vxrs + i) + 1);
|
||||
return user_regset_copyout(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1);
|
||||
return membuf_write(&to, vxrs, sizeof(vxrs));
|
||||
}
|
||||
|
||||
static int s390_vxrs_low_set(struct task_struct *target,
|
||||
@@ -1155,18 +1125,14 @@ static int s390_vxrs_low_set(struct task_struct *target,
|
||||
|
||||
static int s390_vxrs_high_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
__vector128 vxrs[__NUM_VXRS_HIGH];
|
||||
|
||||
if (!MACHINE_HAS_VX)
|
||||
return -ENODEV;
|
||||
if (target == current)
|
||||
save_fpu_regs();
|
||||
memcpy(vxrs, target->thread.fpu.vxrs + __NUM_VXRS_LOW, sizeof(vxrs));
|
||||
|
||||
return user_regset_copyout(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1);
|
||||
return membuf_write(&to, target->thread.fpu.vxrs + __NUM_VXRS_LOW,
|
||||
__NUM_VXRS_HIGH * sizeof(__vector128));
|
||||
}
|
||||
|
||||
static int s390_vxrs_high_set(struct task_struct *target,
|
||||
@@ -1188,12 +1154,9 @@ static int s390_vxrs_high_set(struct task_struct *target,
|
||||
|
||||
static int s390_system_call_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
unsigned int *data = &target->thread.system_call;
|
||||
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||
data, 0, sizeof(unsigned int));
|
||||
return membuf_store(&to, target->thread.system_call);
|
||||
}
|
||||
|
||||
static int s390_system_call_set(struct task_struct *target,
|
||||
@@ -1208,8 +1171,7 @@ static int s390_system_call_set(struct task_struct *target,
|
||||
|
||||
static int s390_gs_cb_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
struct gs_cb *data = target->thread.gs_cb;
|
||||
|
||||
@@ -1219,8 +1181,7 @@ static int s390_gs_cb_get(struct task_struct *target,
|
||||
return -ENODATA;
|
||||
if (target == current)
|
||||
save_gs_cb(data);
|
||||
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||
data, 0, sizeof(struct gs_cb));
|
||||
return membuf_write(&to, data, sizeof(struct gs_cb));
|
||||
}
|
||||
|
||||
static int s390_gs_cb_set(struct task_struct *target,
|
||||
@@ -1264,8 +1225,7 @@ static int s390_gs_cb_set(struct task_struct *target,
|
||||
|
||||
static int s390_gs_bc_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
struct gs_cb *data = target->thread.gs_bc_cb;
|
||||
|
||||
@@ -1273,8 +1233,7 @@ static int s390_gs_bc_get(struct task_struct *target,
|
||||
return -ENODEV;
|
||||
if (!data)
|
||||
return -ENODATA;
|
||||
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||
data, 0, sizeof(struct gs_cb));
|
||||
return membuf_write(&to, data, sizeof(struct gs_cb));
|
||||
}
|
||||
|
||||
static int s390_gs_bc_set(struct task_struct *target,
|
||||
@@ -1325,8 +1284,7 @@ static bool is_ri_cb_valid(struct runtime_instr_cb *cb)
|
||||
|
||||
static int s390_runtime_instr_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
struct runtime_instr_cb *data = target->thread.ri_cb;
|
||||
|
||||
@@ -1335,8 +1293,7 @@ static int s390_runtime_instr_get(struct task_struct *target,
|
||||
if (!data)
|
||||
return -ENODATA;
|
||||
|
||||
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||
data, 0, sizeof(struct runtime_instr_cb));
|
||||
return membuf_write(&to, data, sizeof(struct runtime_instr_cb));
|
||||
}
|
||||
|
||||
static int s390_runtime_instr_set(struct task_struct *target,
|
||||
@@ -1392,7 +1349,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = sizeof(s390_regs) / sizeof(long),
|
||||
.size = sizeof(long),
|
||||
.align = sizeof(long),
|
||||
.get = s390_regs_get,
|
||||
.regset_get = s390_regs_get,
|
||||
.set = s390_regs_set,
|
||||
},
|
||||
{
|
||||
@@ -1400,7 +1357,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = sizeof(s390_fp_regs) / sizeof(long),
|
||||
.size = sizeof(long),
|
||||
.align = sizeof(long),
|
||||
.get = s390_fpregs_get,
|
||||
.regset_get = s390_fpregs_get,
|
||||
.set = s390_fpregs_set,
|
||||
},
|
||||
{
|
||||
@@ -1408,7 +1365,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = 1,
|
||||
.size = sizeof(unsigned int),
|
||||
.align = sizeof(unsigned int),
|
||||
.get = s390_system_call_get,
|
||||
.regset_get = s390_system_call_get,
|
||||
.set = s390_system_call_set,
|
||||
},
|
||||
{
|
||||
@@ -1416,7 +1373,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = 1,
|
||||
.size = sizeof(long),
|
||||
.align = sizeof(long),
|
||||
.get = s390_last_break_get,
|
||||
.regset_get = s390_last_break_get,
|
||||
.set = s390_last_break_set,
|
||||
},
|
||||
{
|
||||
@@ -1424,7 +1381,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = 1,
|
||||
.size = 256,
|
||||
.align = 1,
|
||||
.get = s390_tdb_get,
|
||||
.regset_get = s390_tdb_get,
|
||||
.set = s390_tdb_set,
|
||||
},
|
||||
{
|
||||
@@ -1432,7 +1389,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = __NUM_VXRS_LOW,
|
||||
.size = sizeof(__u64),
|
||||
.align = sizeof(__u64),
|
||||
.get = s390_vxrs_low_get,
|
||||
.regset_get = s390_vxrs_low_get,
|
||||
.set = s390_vxrs_low_set,
|
||||
},
|
||||
{
|
||||
@@ -1440,7 +1397,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = __NUM_VXRS_HIGH,
|
||||
.size = sizeof(__vector128),
|
||||
.align = sizeof(__vector128),
|
||||
.get = s390_vxrs_high_get,
|
||||
.regset_get = s390_vxrs_high_get,
|
||||
.set = s390_vxrs_high_set,
|
||||
},
|
||||
{
|
||||
@@ -1448,7 +1405,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = sizeof(struct gs_cb) / sizeof(__u64),
|
||||
.size = sizeof(__u64),
|
||||
.align = sizeof(__u64),
|
||||
.get = s390_gs_cb_get,
|
||||
.regset_get = s390_gs_cb_get,
|
||||
.set = s390_gs_cb_set,
|
||||
},
|
||||
{
|
||||
@@ -1456,7 +1413,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = sizeof(struct gs_cb) / sizeof(__u64),
|
||||
.size = sizeof(__u64),
|
||||
.align = sizeof(__u64),
|
||||
.get = s390_gs_bc_get,
|
||||
.regset_get = s390_gs_bc_get,
|
||||
.set = s390_gs_bc_set,
|
||||
},
|
||||
{
|
||||
@@ -1464,7 +1421,7 @@ static const struct user_regset s390_regsets[] = {
|
||||
.n = sizeof(struct runtime_instr_cb) / sizeof(__u64),
|
||||
.size = sizeof(__u64),
|
||||
.align = sizeof(__u64),
|
||||
.get = s390_runtime_instr_get,
|
||||
.regset_get = s390_runtime_instr_get,
|
||||
.set = s390_runtime_instr_set,
|
||||
},
|
||||
};
|
||||
@@ -1479,28 +1436,15 @@ static const struct user_regset_view user_s390_view = {
|
||||
#ifdef CONFIG_COMPAT
|
||||
static int s390_compat_regs_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
unsigned n;
|
||||
|
||||
if (target == current)
|
||||
save_access_regs(target->thread.acrs);
|
||||
|
||||
if (kbuf) {
|
||||
compat_ulong_t *k = kbuf;
|
||||
while (count > 0) {
|
||||
*k++ = __peek_user_compat(target, pos);
|
||||
count -= sizeof(*k);
|
||||
pos += sizeof(*k);
|
||||
}
|
||||
} else {
|
||||
compat_ulong_t __user *u = ubuf;
|
||||
while (count > 0) {
|
||||
if (__put_user(__peek_user_compat(target, pos), u++))
|
||||
return -EFAULT;
|
||||
count -= sizeof(*u);
|
||||
pos += sizeof(*u);
|
||||
}
|
||||
}
|
||||
for (n = 0; n < sizeof(s390_compat_regs); n += sizeof(compat_ulong_t))
|
||||
membuf_store(&to, __peek_user_compat(target, n));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1542,29 +1486,14 @@ static int s390_compat_regs_set(struct task_struct *target,
|
||||
|
||||
static int s390_compat_regs_high_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
compat_ulong_t *gprs_high;
|
||||
int i;
|
||||
|
||||
gprs_high = (compat_ulong_t *)
|
||||
&task_pt_regs(target)->gprs[pos / sizeof(compat_ulong_t)];
|
||||
if (kbuf) {
|
||||
compat_ulong_t *k = kbuf;
|
||||
while (count > 0) {
|
||||
*k++ = *gprs_high;
|
||||
gprs_high += 2;
|
||||
count -= sizeof(*k);
|
||||
}
|
||||
} else {
|
||||
compat_ulong_t __user *u = ubuf;
|
||||
while (count > 0) {
|
||||
if (__put_user(*gprs_high, u++))
|
||||
return -EFAULT;
|
||||
gprs_high += 2;
|
||||
count -= sizeof(*u);
|
||||
}
|
||||
}
|
||||
gprs_high = (compat_ulong_t *)task_pt_regs(target)->gprs;
|
||||
for (i = 0; i < NUM_GPRS; i++, gprs_high += 2)
|
||||
membuf_store(&to, *gprs_high);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1603,23 +1532,11 @@ static int s390_compat_regs_high_set(struct task_struct *target,
|
||||
|
||||
static int s390_compat_last_break_get(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
struct membuf to)
|
||||
{
|
||||
compat_ulong_t last_break;
|
||||
compat_ulong_t last_break = target->thread.last_break;
|
||||
|
||||
if (count > 0) {
|
||||
last_break = target->thread.last_break;
|
||||
if (kbuf) {
|
||||
unsigned long *k = kbuf;
|
||||
*k = last_break;
|
||||
} else {
|
||||
unsigned long __user *u = ubuf;
|
||||
if (__put_user(last_break, u))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return membuf_store(&to, (unsigned long)last_break);
|
||||
}
|
||||
|
||||
static int s390_compat_last_break_set(struct task_struct *target,
|
||||
@@ -1636,7 +1553,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = sizeof(s390_compat_regs) / sizeof(compat_long_t),
|
||||
.size = sizeof(compat_long_t),
|
||||
.align = sizeof(compat_long_t),
|
||||
.get = s390_compat_regs_get,
|
||||
.regset_get = s390_compat_regs_get,
|
||||
.set = s390_compat_regs_set,
|
||||
},
|
||||
{
|
||||
@@ -1644,7 +1561,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = sizeof(s390_fp_regs) / sizeof(compat_long_t),
|
||||
.size = sizeof(compat_long_t),
|
||||
.align = sizeof(compat_long_t),
|
||||
.get = s390_fpregs_get,
|
||||
.regset_get = s390_fpregs_get,
|
||||
.set = s390_fpregs_set,
|
||||
},
|
||||
{
|
||||
@@ -1652,7 +1569,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = 1,
|
||||
.size = sizeof(compat_uint_t),
|
||||
.align = sizeof(compat_uint_t),
|
||||
.get = s390_system_call_get,
|
||||
.regset_get = s390_system_call_get,
|
||||
.set = s390_system_call_set,
|
||||
},
|
||||
{
|
||||
@@ -1660,7 +1577,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = 1,
|
||||
.size = sizeof(long),
|
||||
.align = sizeof(long),
|
||||
.get = s390_compat_last_break_get,
|
||||
.regset_get = s390_compat_last_break_get,
|
||||
.set = s390_compat_last_break_set,
|
||||
},
|
||||
{
|
||||
@@ -1668,7 +1585,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = 1,
|
||||
.size = 256,
|
||||
.align = 1,
|
||||
.get = s390_tdb_get,
|
||||
.regset_get = s390_tdb_get,
|
||||
.set = s390_tdb_set,
|
||||
},
|
||||
{
|
||||
@@ -1676,7 +1593,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = __NUM_VXRS_LOW,
|
||||
.size = sizeof(__u64),
|
||||
.align = sizeof(__u64),
|
||||
.get = s390_vxrs_low_get,
|
||||
.regset_get = s390_vxrs_low_get,
|
||||
.set = s390_vxrs_low_set,
|
||||
},
|
||||
{
|
||||
@@ -1684,7 +1601,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = __NUM_VXRS_HIGH,
|
||||
.size = sizeof(__vector128),
|
||||
.align = sizeof(__vector128),
|
||||
.get = s390_vxrs_high_get,
|
||||
.regset_get = s390_vxrs_high_get,
|
||||
.set = s390_vxrs_high_set,
|
||||
},
|
||||
{
|
||||
@@ -1692,7 +1609,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = sizeof(s390_compat_regs_high) / sizeof(compat_long_t),
|
||||
.size = sizeof(compat_long_t),
|
||||
.align = sizeof(compat_long_t),
|
||||
.get = s390_compat_regs_high_get,
|
||||
.regset_get = s390_compat_regs_high_get,
|
||||
.set = s390_compat_regs_high_set,
|
||||
},
|
||||
{
|
||||
@@ -1700,7 +1617,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = sizeof(struct gs_cb) / sizeof(__u64),
|
||||
.size = sizeof(__u64),
|
||||
.align = sizeof(__u64),
|
||||
.get = s390_gs_cb_get,
|
||||
.regset_get = s390_gs_cb_get,
|
||||
.set = s390_gs_cb_set,
|
||||
},
|
||||
{
|
||||
@@ -1708,7 +1625,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = sizeof(struct gs_cb) / sizeof(__u64),
|
||||
.size = sizeof(__u64),
|
||||
.align = sizeof(__u64),
|
||||
.get = s390_gs_bc_get,
|
||||
.regset_get = s390_gs_bc_get,
|
||||
.set = s390_gs_bc_set,
|
||||
},
|
||||
{
|
||||
@@ -1716,7 +1633,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
||||
.n = sizeof(struct runtime_instr_cb) / sizeof(__u64),
|
||||
.size = sizeof(__u64),
|
||||
.align = sizeof(__u64),
|
||||
.get = s390_runtime_instr_get,
|
||||
.regset_get = s390_runtime_instr_get,
|
||||
.set = s390_runtime_instr_set,
|
||||
},
|
||||
};
|
||||
|
Reference in New Issue
Block a user