diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-29 21:12:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-29 21:12:23 -0400 |
commit | a591afc01d9e48affbacb365558a31e53c85af45 (patch) | |
tree | 9bb91f4eb94ec69fc4706c4944788ec5f3586063 /fs/binfmt_elf.c | |
parent | 820d41cf0cd0e94a5661e093821e2e5c6b36a9d8 (diff) | |
parent | 31796ac4e8f0e88f5c10f1ad6dab8f19bebe44a4 (diff) |
Merge branch 'x86-x32-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x32 support for x86-64 from Ingo Molnar:
"This tree introduces the X32 binary format and execution mode for x86:
32-bit data space binaries using 64-bit instructions and 64-bit kernel
syscalls.
This allows applications whose working set fits into a 32 bits address
space to make use of 64-bit instructions while using a 32-bit address
space with shorter pointers, more compressed data structures, etc."
Fix up trivial context conflicts in arch/x86/{Kconfig,vdso/vma.c}
* 'x86-x32-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (71 commits)
x32: Fix alignment fail in struct compat_siginfo
x32: Fix stupid ia32/x32 inversion in the siginfo format
x32: Add ptrace for x32
x32: Switch to a 64-bit clock_t
x32: Provide separate is_ia32_task() and is_x32_task() predicates
x86, mtrr: Use explicit sizing and padding for the 64-bit ioctls
x86/x32: Fix the binutils auto-detect
x32: Warn and disable rather than error if binutils too old
x32: Only clear TIF_X32 flag once
x32: Make sure TS_COMPAT is cleared for x32 tasks
fs: Remove missed ->fds_bits from cessation use of fd_set structs internally
fs: Fix close_on_exec pointer in alloc_fdtable
x32: Drop non-__vdso weak symbols from the x32 VDSO
x32: Fix coding style violations in the x32 VDSO code
x32: Add x32 VDSO support
x32: Allow x32 to be configured
x32: If configured, add x32 system calls to system call tables
x32: Handle process creation
x32: Signal-related system calls
x86: Add #ifdef CONFIG_COMPAT to <asm/sys_ia32.h>
...
Diffstat (limited to 'fs/binfmt_elf.c')
-rw-r--r-- | fs/binfmt_elf.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 7d7ff206cdcb..48ffb3dc610a 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -1415,6 +1415,22 @@ static void do_thread_regset_writeback(struct task_struct *task, | |||
1415 | regset->writeback(task, regset, 1); | 1415 | regset->writeback(task, regset, 1); |
1416 | } | 1416 | } |
1417 | 1417 | ||
1418 | #ifndef PR_REG_SIZE | ||
1419 | #define PR_REG_SIZE(S) sizeof(S) | ||
1420 | #endif | ||
1421 | |||
1422 | #ifndef PRSTATUS_SIZE | ||
1423 | #define PRSTATUS_SIZE(S) sizeof(S) | ||
1424 | #endif | ||
1425 | |||
1426 | #ifndef PR_REG_PTR | ||
1427 | #define PR_REG_PTR(S) (&((S)->pr_reg)) | ||
1428 | #endif | ||
1429 | |||
1430 | #ifndef SET_PR_FPVALID | ||
1431 | #define SET_PR_FPVALID(S, V) ((S)->pr_fpvalid = (V)) | ||
1432 | #endif | ||
1433 | |||
1418 | static int fill_thread_core_info(struct elf_thread_core_info *t, | 1434 | static int fill_thread_core_info(struct elf_thread_core_info *t, |
1419 | const struct user_regset_view *view, | 1435 | const struct user_regset_view *view, |
1420 | long signr, size_t *total) | 1436 | long signr, size_t *total) |
@@ -1429,11 +1445,11 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, | |||
1429 | */ | 1445 | */ |
1430 | fill_prstatus(&t->prstatus, t->task, signr); | 1446 | fill_prstatus(&t->prstatus, t->task, signr); |
1431 | (void) view->regsets[0].get(t->task, &view->regsets[0], | 1447 | (void) view->regsets[0].get(t->task, &view->regsets[0], |
1432 | 0, sizeof(t->prstatus.pr_reg), | 1448 | 0, PR_REG_SIZE(t->prstatus.pr_reg), |
1433 | &t->prstatus.pr_reg, NULL); | 1449 | PR_REG_PTR(&t->prstatus), NULL); |
1434 | 1450 | ||
1435 | fill_note(&t->notes[0], "CORE", NT_PRSTATUS, | 1451 | fill_note(&t->notes[0], "CORE", NT_PRSTATUS, |
1436 | sizeof(t->prstatus), &t->prstatus); | 1452 | PRSTATUS_SIZE(t->prstatus), &t->prstatus); |
1437 | *total += notesize(&t->notes[0]); | 1453 | *total += notesize(&t->notes[0]); |
1438 | 1454 | ||
1439 | do_thread_regset_writeback(t->task, &view->regsets[0]); | 1455 | do_thread_regset_writeback(t->task, &view->regsets[0]); |
@@ -1463,7 +1479,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, | |||
1463 | regset->core_note_type, | 1479 | regset->core_note_type, |
1464 | size, data); | 1480 | size, data); |
1465 | else { | 1481 | else { |
1466 | t->prstatus.pr_fpvalid = 1; | 1482 | SET_PR_FPVALID(&t->prstatus, 1); |
1467 | fill_note(&t->notes[i], "CORE", | 1483 | fill_note(&t->notes[i], "CORE", |
1468 | NT_PRFPREG, size, data); | 1484 | NT_PRFPREG, size, data); |
1469 | } | 1485 | } |