x86: ioperm user_regset
This adds a user_regset type for the x86 io permissions bitmap. This makes it appear in core dumps (when ioperm has been used). It will also make it visible to debuggers in the future. Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com> [conflict resolutions: Signed-off-by: Ingo Molnar <mingo@elte.hu> ]
This commit is contained in:
parent
fd04808830
commit
325af5fb14
|
@ -40,7 +40,9 @@ enum x86_regset {
|
||||||
REGSET_GENERAL,
|
REGSET_GENERAL,
|
||||||
REGSET_FP,
|
REGSET_FP,
|
||||||
REGSET_XFP,
|
REGSET_XFP,
|
||||||
|
REGSET_IOPERM64 = REGSET_XFP,
|
||||||
REGSET_TLS,
|
REGSET_TLS,
|
||||||
|
REGSET_IOPERM32,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -555,6 +557,29 @@ static int ptrace_set_debugreg(struct task_struct *child,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These access the current or another (stopped) task's io permission
|
||||||
|
* bitmap for debugging or core dump.
|
||||||
|
*/
|
||||||
|
static int ioperm_active(struct task_struct *target,
|
||||||
|
const struct user_regset *regset)
|
||||||
|
{
|
||||||
|
return target->thread.io_bitmap_max / regset->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ioperm_get(struct task_struct *target,
|
||||||
|
const struct user_regset *regset,
|
||||||
|
unsigned int pos, unsigned int count,
|
||||||
|
void *kbuf, void __user *ubuf)
|
||||||
|
{
|
||||||
|
if (!target->thread.io_bitmap_ptr)
|
||||||
|
return -ENXIO;
|
||||||
|
|
||||||
|
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||||
|
target->thread.io_bitmap_ptr,
|
||||||
|
0, IO_BITMAP_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_PTRACE_BTS
|
#ifdef CONFIG_X86_PTRACE_BTS
|
||||||
/*
|
/*
|
||||||
* The configuration for a particular BTS hardware implementation.
|
* The configuration for a particular BTS hardware implementation.
|
||||||
|
@ -1385,6 +1410,12 @@ static const struct user_regset x86_64_regsets[] = {
|
||||||
.size = sizeof(long), .align = sizeof(long),
|
.size = sizeof(long), .align = sizeof(long),
|
||||||
.active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set
|
.active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set
|
||||||
},
|
},
|
||||||
|
[REGSET_IOPERM64] = {
|
||||||
|
.core_note_type = NT_386_IOPERM,
|
||||||
|
.n = IO_BITMAP_LONGS,
|
||||||
|
.size = sizeof(long), .align = sizeof(long),
|
||||||
|
.active = ioperm_active, .get = ioperm_get
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct user_regset_view user_x86_64_view = {
|
static const struct user_regset_view user_x86_64_view = {
|
||||||
|
@ -1431,6 +1462,12 @@ static const struct user_regset x86_32_regsets[] = {
|
||||||
.active = regset_tls_active,
|
.active = regset_tls_active,
|
||||||
.get = regset_tls_get, .set = regset_tls_set
|
.get = regset_tls_get, .set = regset_tls_set
|
||||||
},
|
},
|
||||||
|
[REGSET_IOPERM32] = {
|
||||||
|
.core_note_type = NT_386_IOPERM,
|
||||||
|
.n = IO_BITMAP_BYTES / sizeof(u32),
|
||||||
|
.size = sizeof(u32), .align = sizeof(u32),
|
||||||
|
.active = ioperm_active, .get = ioperm_get
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct user_regset_view user_x86_32_view = {
|
static const struct user_regset_view user_x86_32_view = {
|
||||||
|
|
|
@ -360,6 +360,7 @@ typedef struct elf64_shdr {
|
||||||
#define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */
|
#define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */
|
||||||
#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */
|
#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */
|
||||||
#define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */
|
#define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */
|
||||||
|
#define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */
|
||||||
|
|
||||||
|
|
||||||
/* Note header in a PT_NOTE section */
|
/* Note header in a PT_NOTE section */
|
||||||
|
|
Loading…
Reference in New Issue