Commit b934069c authored by Martin Schwidefsky's avatar Martin Schwidefsky

[S390] add missing .set function for NT_S390_LAST_BREAK regset

The last breaking event address is a read-only value, the regset misses the
.set function. If a PTRACE_SETREGSET is done for NT_S390_LAST_BREAK we
get an oops due to a branch to zero:

Kernel BUG at 0000000000000002 verbose debug info unavailable
illegal operation: 0001 #1 SMP
...
Call Trace:
(<0000000000158294> ptrace_regset+0x184/0x188)
 <00000000001595b6> ptrace_request+0x37a/0x4fc
 <0000000000109a78> arch_ptrace+0x108/0x1fc
 <00000000001590d6> SyS_ptrace+0xaa/0x12c
 <00000000005c7a42> sysc_noemu+0x16/0x1c
 <000003fffd5ec10c> 0x3fffd5ec10c
Last Breaking-Event-Address:
 <0000000000158242> ptrace_regset+0x132/0x188

Add a nop .set function to prevent the branch to zero.
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Cc: stable@kernel.org
parent 7c81878b
...@@ -905,6 +905,14 @@ static int s390_last_break_get(struct task_struct *target, ...@@ -905,6 +905,14 @@ static int s390_last_break_get(struct task_struct *target,
return 0; return 0;
} }
static int s390_last_break_set(struct task_struct *target,
const struct user_regset *regset,
unsigned int pos, unsigned int count,
const void *kbuf, const void __user *ubuf)
{
return 0;
}
#endif #endif
static int s390_system_call_get(struct task_struct *target, static int s390_system_call_get(struct task_struct *target,
...@@ -951,6 +959,7 @@ static const struct user_regset s390_regsets[] = { ...@@ -951,6 +959,7 @@ static const struct user_regset s390_regsets[] = {
.size = sizeof(long), .size = sizeof(long),
.align = sizeof(long), .align = sizeof(long),
.get = s390_last_break_get, .get = s390_last_break_get,
.set = s390_last_break_set,
}, },
#endif #endif
[REGSET_SYSTEM_CALL] = { [REGSET_SYSTEM_CALL] = {
...@@ -1116,6 +1125,14 @@ static int s390_compat_last_break_get(struct task_struct *target, ...@@ -1116,6 +1125,14 @@ static int s390_compat_last_break_get(struct task_struct *target,
return 0; return 0;
} }
static int s390_compat_last_break_set(struct task_struct *target,
const struct user_regset *regset,
unsigned int pos, unsigned int count,
const void *kbuf, const void __user *ubuf)
{
return 0;
}
static const struct user_regset s390_compat_regsets[] = { static const struct user_regset s390_compat_regsets[] = {
[REGSET_GENERAL] = { [REGSET_GENERAL] = {
.core_note_type = NT_PRSTATUS, .core_note_type = NT_PRSTATUS,
...@@ -1139,6 +1156,7 @@ static const struct user_regset s390_compat_regsets[] = { ...@@ -1139,6 +1156,7 @@ static const struct user_regset s390_compat_regsets[] = {
.size = sizeof(long), .size = sizeof(long),
.align = sizeof(long), .align = sizeof(long),
.get = s390_compat_last_break_get, .get = s390_compat_last_break_get,
.set = s390_compat_last_break_set,
}, },
[REGSET_SYSTEM_CALL] = { [REGSET_SYSTEM_CALL] = {
.core_note_type = NT_S390_SYSTEM_CALL, .core_note_type = NT_S390_SYSTEM_CALL,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment