diff options
Diffstat (limited to 'fs/binfmt_elf.c')
| -rw-r--r-- | fs/binfmt_elf.c | 23 | 
1 files changed, 8 insertions, 15 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index e5495f37c6ed..2472af2798c7 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1624,20 +1624,12 @@ static void do_thread_regset_writeback(struct task_struct *task,  		regset->writeback(task, regset, 1);  } -#ifndef PR_REG_SIZE -#define PR_REG_SIZE(S) sizeof(S) -#endif -  #ifndef PRSTATUS_SIZE -#define PRSTATUS_SIZE(S) sizeof(S) -#endif - -#ifndef PR_REG_PTR -#define PR_REG_PTR(S) (&((S)->pr_reg)) +#define PRSTATUS_SIZE(S, R) sizeof(S)  #endif  #ifndef SET_PR_FPVALID -#define SET_PR_FPVALID(S, V) ((S)->pr_fpvalid = (V)) +#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))  #endif  static int fill_thread_core_info(struct elf_thread_core_info *t, @@ -1645,6 +1637,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,  				 long signr, size_t *total)  {  	unsigned int i; +	unsigned int regset_size = view->regsets[0].n * view->regsets[0].size;  	/*  	 * NT_PRSTATUS is the one special case, because the regset data @@ -1653,12 +1646,11 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,  	 * We assume that regset 0 is NT_PRSTATUS.  	 */  	fill_prstatus(&t->prstatus, t->task, signr); -	(void) view->regsets[0].get(t->task, &view->regsets[0], -				    0, PR_REG_SIZE(t->prstatus.pr_reg), -				    PR_REG_PTR(&t->prstatus), NULL); +	(void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset_size, +				    &t->prstatus.pr_reg, NULL);  	fill_note(&t->notes[0], "CORE", NT_PRSTATUS, -		  PRSTATUS_SIZE(t->prstatus), &t->prstatus); +		  PRSTATUS_SIZE(t->prstatus, regset_size), &t->prstatus);  	*total += notesize(&t->notes[0]);  	do_thread_regset_writeback(t->task, &view->regsets[0]); @@ -1688,7 +1680,8 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,  						  regset->core_note_type,  						  size, data);  				else { -					SET_PR_FPVALID(&t->prstatus, 1); +					SET_PR_FPVALID(&t->prstatus, +							1, regset_size);  					fill_note(&t->notes[i], "CORE",  						  NT_PRFPREG, size, data);  				}  | 
