mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
core dump: user_regset writeback
This makes the user_regset-based core dump code call user_regset writeback hooks when available. This is necessary groundwork to allow IA64 to set CORE_DUMP_USE_REGSET. Cc: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Roland McGrath <roland@redhat.com> Cc: "Luck, Tony" <tony.luck@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
938a9204e0
commit
d31472b6d4
1 changed files with 15 additions and 0 deletions
|
@ -1424,6 +1424,18 @@ struct elf_note_info {
|
|||
int thread_notes;
|
||||
};
|
||||
|
||||
/*
|
||||
* When a regset has a writeback hook, we call it on each thread before
|
||||
* dumping user memory. On register window machines, this makes sure the
|
||||
* user memory backing the register data is up to date before we read it.
|
||||
*/
|
||||
static void do_thread_regset_writeback(struct task_struct *task,
|
||||
const struct user_regset *regset)
|
||||
{
|
||||
if (regset->writeback)
|
||||
regset->writeback(task, regset, 1);
|
||||
}
|
||||
|
||||
static int fill_thread_core_info(struct elf_thread_core_info *t,
|
||||
const struct user_regset_view *view,
|
||||
long signr, size_t *total)
|
||||
|
@ -1445,6 +1457,8 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,
|
|||
sizeof(t->prstatus), &t->prstatus);
|
||||
*total += notesize(&t->notes[0]);
|
||||
|
||||
do_thread_regset_writeback(t->task, &view->regsets[0]);
|
||||
|
||||
/*
|
||||
* Each other regset might generate a note too. For each regset
|
||||
* that has no core_note_type or is inactive, we leave t->notes[i]
|
||||
|
@ -1452,6 +1466,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,
|
|||
*/
|
||||
for (i = 1; i < view->n; ++i) {
|
||||
const struct user_regset *regset = &view->regsets[i];
|
||||
do_thread_regset_writeback(t->task, regset);
|
||||
if (regset->core_note_type &&
|
||||
(!regset->active || regset->active(t->task, regset))) {
|
||||
int ret;
|
||||
|
|
Loading…
Reference in a new issue