Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755039AbbKQVUa (ORCPT ); Tue, 17 Nov 2015 16:20:30 -0500 Received: from mail-by2on0068.outbound.protection.outlook.com ([207.46.100.68]:53472 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755020AbbKQVUY (ORCPT ); Tue, 17 Nov 2015 16:20:24 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Yuri.Norov@caviumnetworks.com; From: Yury Norov To: , , , CC: , , , , , , , , , , , , , , Yury Norov Subject: [PATCH v6 11/19] arm64:ilp32: support core dump generation for ILP32 Date: Wed, 18 Nov 2015 00:16:51 +0300 Message-ID: <1447795019-30176-12-git-send-email-ynorov@caviumnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1447795019-30176-1-git-send-email-ynorov@caviumnetworks.com> References: <1447795019-30176-1-git-send-email-ynorov@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [95.143.213.120] X-ClientProxiedBy: AM3PR01CA032.eurprd01.prod.exchangelabs.com (10.141.191.22) To BLUPR07MB611.namprd07.prod.outlook.com (10.141.207.16) X-Microsoft-Exchange-Diagnostics: 1;BLUPR07MB611;2:xJQ0MeEvTJ544UOFBMVhzTbt45/Ge/KfI1I3vMD9Ejv/SYq7w/iKPpmKJSK0DpW7unCTnomSlA9ai3+PN7sIwSQUbEWYrx10Y4PJ4dZHFbSjq8OclMXI8uu45NCTBKZU1mha5PJaVh65Ptn1bNb39ZP7CHc9jS9bb821F68y+Gk=;3:ONVJ2mdJZzzFlpq2bwC3ERCA3uoqaN9Ksq4JOr6XYJufhC63ivCnuhiIcLiEUiVwwUzv4Hu5iZGb1YTI5exbPwfWpHs7shpA6WkZnz5nhr2EPT4u4BwcMicav+keWfKWL0b7vvSgE1y4Nm9vb5rtgA==;25:gR2QrvhruoOQJabmKqjM1nw0DG46ZiOJ2lnSvnbMr0a0h1ZE1+gPsgKwVlcbFwGvjOQh8Tb341I3I8GQSWF6N1YbReSfTssZW0evxtbefd9FKFaxldbDq3o8+cLaB7OPTpBh9Yn5UC1h9CIpCOd7QwIjqUY+b1sjWceeadLxpD0l0FYxma6YkamBpd+LsieoB/j3E1Sb/G4IlRoO5hmWk13zrcTSYx5OedVHKdHbXwzQgaSrlyUxwDWk39EvZWyCJ2yTT885bh/Uwg4J+4ksBQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR07MB611; X-Microsoft-Exchange-Diagnostics: 1;BLUPR07MB611;20:ARCLYseJO7bTOVkrCPLX8NkJGcn5btD/t+ycU8OBqJKHbILX4mVLhNRsJuWwO1HSjRUzJ0C7WABHOksEMSaPoWu2uI1RWKQqx0D0MrDZRRZo//FJkbEZ8y4T3VIh3Wnl3b7QYkJDCs0dAbCqBqATqr+F03+UfqcwRadilKreGmqs+fFR6BSM7Z1veCDAdenNs+c73+a/sV0aYp1H5SrcMPldSMDExBq6WjS4F72NlvhSRYbZXKbd1Lx72CmlX2uwYU2W9shN9+fDE7awy+zoPJPImNM0KG3accklqvgtC+4Z5UPISGazuNqysp5c8mnIHxe+FFTpN/3UGvYWft8HC6P0Yn6D6qfQMwRmULYGRPGYnpsMDe1pwOvqvxqonzfaTaiTLkf8/dwIiNdu1KmOc0ABkpnmjNEPxtOfCSNbu7iUzo0CdDDH8eiYKu1eOKTK5MHeTIwzR7u4FsXazOao6OoWsNQ+HnjtHM6PuBcoRLmecuf3FZ0bgrHtDQFINq7h+t6CuqdrB/ILwSFNExOMCe7ESWOlG45xPHywYDg+tYTv7lV3uIjde66EErzIMIMXY2IA4vQb1iJa8C4lChHN4dB+qsZYN5lkuRXAsuYKhOk= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(236414709691187); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(3002001)(10201501046);SRVR:BLUPR07MB611;BCL:0;PCL:0;RULEID:;SRVR:BLUPR07MB611; X-Microsoft-Exchange-Diagnostics: 1;BLUPR07MB611;4:TcQzDNLQOt5gIKohIv2PQZEgwqoYD598katC/SgcbR69gsh2375clPjw2ROqpgrJIXkoQH6khF03C9wwqokVNA+UR9i1gBzvm4LAYLilpmptnJhC/gpea7BTyBIwjVmsqA0NUrFNeZYyOO2d/ClsM8M1XxDOONAZvqXsGH63Y0AG1I+nEKEaTxLc7lvO2FYDlsDP7QLKwxPH5z5acbwcQZ82i6WOxJ5S3m+aDUZuJZkvNeeOgVli+7mdZdnD3wfhZTDZG7bo3RWdZVQO++4iK5QkNXY01U+gPR1L/jlljROFiu2YfIZ2+5NeeLYciCQYSqBWenFMJvvjTx2vI8Ms/jNAETZEhR4pBMyLZdEFYyy9G2vW2ZSJ8Co8+RaFUjAI X-Forefront-PRVS: 07630F72AD X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(6069001)(199003)(189002)(33646002)(42186005)(5008740100001)(40100003)(50986999)(5007970100001)(586003)(66066001)(76176999)(122386002)(189998001)(47776003)(36756003)(2950100001)(50466002)(5003940100001)(4001430100002)(5004730100002)(105586002)(106356001)(229853001)(48376002)(97736004)(19580405001)(87976001)(50226001)(19580395003)(5001770100001)(2201001)(575784001)(92566002)(101416001)(107886002)(5001920100001)(81156007)(5001960100002)(77096005)(76506005)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR07MB611;H:localhost;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR07MB611;23:Ktv5hYEPj1KS8uAOpvTK32T1EMYV9FzgSdQxDlJRDt?= =?us-ascii?Q?dezUSqOM8NXl2N4nGpX3ND2uE+hHoKtaqPcLWQbdiu9gHyLGUxPLhI+j4wZJ?= =?us-ascii?Q?SOzX4r0Ru935J2RqULyZFAodrFAO4KVkc3PdBc2lJzjH+bj7J6k/+1fepQl1?= =?us-ascii?Q?LN016GAic7j2PT9p5wFdqu0a6XxdTSCbKLXvEKg5pOUaP8PMOGAwiLQiAXGs?= =?us-ascii?Q?gIkNeNSTS5WigihgvBJnT9EfCVtCdDl0/vf2l8d6h4YvqqgL1ipAdwzOSx+L?= =?us-ascii?Q?tr6zwAzTdJc8fayq+M0yKcnwdgE34hnB/MfL6IoERlG+fVgZ8Mda9Wz6MQLA?= =?us-ascii?Q?4OYfKZOSV7DCgqefRNYBfEmNh8FYdVTfzmoBjQ2ObI+d0nL2PG449Fl5/2HP?= =?us-ascii?Q?puqIafWDRbLK/mIWdWmmSqRjUndMAmTzx5qG2sAt4P/LoMrn4dgVhv2UT4+c?= =?us-ascii?Q?mE8eP55Ge/HKh1clNUWopEGbUNfFLppkGJ4O+2c11Dd2qJMq+TuYhgvH1ils?= =?us-ascii?Q?55aXtmjTkyvcknjvNJHHwrBimYCwx1kk5JCW9FUziBySl9xXAKJfvF1WABle?= =?us-ascii?Q?uiJ9voneosrF4OQ7vm/ku087howZ5LkWOeDgUdwnkLbMENoQqi9nbpftQp7X?= =?us-ascii?Q?zHKez0JfQ1cO9DxntuaLHfdZW6K8GksG10WMjpV8EIcRD6MNypYt7ptkh92t?= =?us-ascii?Q?vW/ixqX3/P7cOp+nxL8wv1bfZL04Qed+Rsg0//4Uf+tdWEmbCM4ssrWBl82U?= =?us-ascii?Q?6fkkpQ5/FtzJBMEta1FOkArCcK7S6J1Joqag9dTexXPvhwwkm1k8Z41XAX4k?= =?us-ascii?Q?0TQ509nTkKbuYnJbuItzEoB8pLLEgYm9WpdTl/PXVefqOGVZ580Fl44BsCQS?= =?us-ascii?Q?ChkoM8LFEGQfL3TUCO0lP8vZEWP/BcAu9GN8Ab261wxDLv19e+n8fghdmqk2?= =?us-ascii?Q?0wYrJfEfUafF77VIbsc9iJjPYbmDEQhZPsWX/j6ZdnZIqZu2JF/uYDiwlSPX?= =?us-ascii?Q?Oj5uyGOejKCvijZPkrxSrsshI/O69kAIFgf5zQ4IxIGD9K8mrkz9tSsSnveR?= =?us-ascii?Q?rMOolNgEdAX9TTgQs/uK/zyAKPuMsJq4rzis9+wcojPNyyzxzeGcYNZrs6wa?= =?us-ascii?Q?swhec2syCtueEaMMr4DW1BsuCeNQM9mV79Jx6ajYBRE3CA5h+mO3g3tZ+hT5?= =?us-ascii?Q?UrFe4V7/2bwak=3D?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR07MB611;5:HDJ7+palZM4XddT35V4V//FedFz764Y9zmYL26c0g0ewilDPL7Y2Wp8UshrbwHG/3DpMfLeA76UYAFkhf0FIZHRLgVDr7Xpfu+sxXZvG8QyJ2W5vbXo0dQbg/h/1XTWAU6+OeIJjMFoQLLem5cO+xQ==;24:JYzej8umoDCLj0RTERA6kAkeGl6pWB/emvL7ATJ0P5ZprbhE4eTZSiQx3EppmOFf+agrp13vG555XxaKEAWycKkfkKLAxfRbCxRS11V4Qeo=;20:8X0lAGUeGAt7dZNeMsprQkTMfAHSAxc49wy17vfHcGyfR0qjDbT1LlHrQglK/bUx9H5hr3KJUU+4GHd30cRgGw== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Nov 2015 21:20:21.8032 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR07MB611 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7744 Lines: 221 From: Andrew Pinski This patch supports core dumping on ILP32. We need a few extra macros (COMPAT_PR_REG_SIZE and COMPAT_PRSTATUS_SIZE) due to size differences of the register sets. Reviewed-by: David Daney Signed-off-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Yury Norov Signed-off-by: Andrew Pinski --- arch/arm64/include/asm/elf.h | 87 ++++++++++++++++++++++++++++++++++++++------ arch/arm64/kernel/ptrace.c | 12 +++--- arch/arm64/kernel/vdso.c | 8 ++++ 3 files changed, 89 insertions(+), 18 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 01e032c..8f13dac 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -134,7 +134,11 @@ typedef struct user_fpsimd_state elf_fpregset_t; */ #define ELF_PLAT_INIT(_r, load_addr) (_r)->regs[0] = 0 -#define SET_PERSONALITY(ex) clear_thread_flag(TIF_32BIT); +#define SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + clear_thread_flag(TIF_32BIT); \ +} while (0) #define ARCH_DLINFO \ do { \ @@ -166,12 +170,15 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, #define COMPAT_ELF_ET_DYN_BASE (2 * TASK_SIZE_32 / 3) +extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, + int uses_interp); + #ifdef CONFIG_AARCH32_EL0 /* AArch32 registers. */ #define COMPAT_A32_ELF_NGREG 18 -typedef unsigned int compat_elf_greg_t; -typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_A32_ELF_NGREG]; +typedef unsigned int compat_a32_elf_greg_t; +typedef compat_a32_elf_greg_t compat_a32_elf_gregset_t[COMPAT_A32_ELF_NGREG]; /* AArch32 EABI. */ #define EF_ARM_EABI_MASK 0xff000000 @@ -179,24 +186,80 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_A32_ELF_NGREG]; ((x)->e_flags & EF_ARM_EABI_MASK)) #define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) set_thread_flag(TIF_32BIT); -#define COMPAT_ARCH_DLINFO -extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, - int uses_interp); -#define compat_arch_setup_additional_pages \ - aarch32_setup_vectors_page +#define COMPAT_A32_SET_PERSONALITY(ex) \ +do { \ + clear_thread_flag(TIF_32BIT_AARCH64); \ + set_thread_flag(TIF_32BIT); \ +} while (0) +#define COMPAT_A32_ARCH_DLINFO do {} while (0) #else typedef elf_greg_t compat_elf_greg_t; typedef elf_gregset_t compat_elf_gregset_t; #define compat_a32_elf_check_arch(x) 0 -#define COMPAT_SET_PERSONALITY(ex) -#define COMPAT_ARCH_DLINFO +#define COMPAT_A32_SET_PERSONALITY(ex) do {} while (0) +#define COMPAT_A32_ARCH_DLINFO do {} while (0) +#endif + +/* If ILP32 is turned on, we want to define the compat_elf_greg_t to the non compat + one and define PR_REG_SIZE/PRSTATUS_SIZE/SET_PR_FPVALID so we pick up the correct + ones for AARCH32. Note also the definition of the macros have to be correct for + LP64 as this file is included in the standard binfmt_elf.c. */ +#ifdef CONFIG_ARM64_ILP32 +typedef elf_greg_t compat_elf_greg_t; +typedef elf_gregset_t compat_elf_gregset_t; +#define PR_REG_SIZE(S) (is_a32_compat_task() ? 72 : 272) +#define PRSTATUS_SIZE(S) (is_a32_compat_task() ? 124 : (is_ilp32_compat_task() ? 352 : 392)) +#define SET_PR_FPVALID(S, V) \ +do { \ + *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE((S)->pr_reg)) = (V); \ +} while (0) +#else +typedef compat_a32_elf_greg_t compat_elf_greg_t; +typedef compat_a32_elf_gregset_t compat_elf_gregset_t; +#endif +#ifdef CONFIG_ARM64_ILP32 +#define compat_ilp32_elf_check_arch(x) ((x)->e_machine == EM_AARCH64) +#define COMPAT_ILP32_SET_PERSONALITY(ex) \ +do { \ + set_thread_flag(TIF_32BIT_AARCH64); \ + clear_thread_flag(TIF_32BIT); \ +} while (0) +#define COMPAT_ILP32_ARCH_DLINFO \ +do { \ + NEW_AUX_ENT(AT_SYSINFO_EHDR, \ + (elf_addr_t)(long)current->mm->context.vdso); \ +} while (0) +#else +#define compat_ilp32_elf_check_arch(x) 0 +#define COMPAT_ILP32_SET_PERSONALITY(ex) do {} while (0) +#define COMPAT_ILP32_ARCH_DLINFO do {} while (0) #endif -#define compat_elf_check_arch(x) compat_a32_elf_check_arch(x) +#define compat_elf_check_arch(x) (compat_a32_elf_check_arch(x) || compat_ilp32_elf_check_arch(x)) +#define COMPAT_SET_PERSONALITY(ex) \ +do { \ + if (compat_a32_elf_check_arch(&ex)) \ + COMPAT_A32_SET_PERSONALITY(ex); \ + else \ + COMPAT_ILP32_SET_PERSONALITY(ex); \ +} while (0) + +/* ILP32 uses the "LP64-like" vdso pages */ +#define compat_arch_setup_additional_pages \ + (is_a32_compat_task() \ + ? &aarch32_setup_vectors_page \ + : &(arch_setup_additional_pages)) + +#define COMPAT_ARCH_DLINFO \ +do { \ + if (is_a32_compat_task()) \ + COMPAT_A32_ARCH_DLINFO; \ + else \ + COMPAT_ILP32_ARCH_DLINFO; \ +} while (0) #endif /* CONFIG_COMPAT */ diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index d2e428c..22d0d5e 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -854,8 +854,8 @@ static const struct user_regset aarch32_regsets[] = { [REGSET_COMPAT_GPR] = { .core_note_type = NT_PRSTATUS, .n = COMPAT_A32_ELF_NGREG, - .size = sizeof(compat_elf_greg_t), - .align = sizeof(compat_elf_greg_t), + .size = sizeof(compat_a32_elf_greg_t), + .align = sizeof(compat_a32_elf_greg_t), .get = compat_gpr_get, .set = compat_gpr_set }, @@ -946,7 +946,7 @@ static int compat_ptrace_read_user(struct task_struct *tsk, compat_ulong_t off, tmp = tsk->mm->start_data; else if (off == COMPAT_PT_TEXT_END_ADDR) tmp = tsk->mm->end_code; - else if (off < sizeof(compat_elf_gregset_t)) + else if (off < sizeof(compat_a32_elf_gregset_t)) return copy_regset_to_user(tsk, &user_aarch32_view, REGSET_COMPAT_GPR, off, sizeof(compat_ulong_t), ret); @@ -967,7 +967,7 @@ static int compat_ptrace_write_user(struct task_struct *tsk, compat_ulong_t off, if (off & 3 || off >= COMPAT_USER_SZ) return -EIO; - if (off >= sizeof(compat_elf_gregset_t)) + if (off >= sizeof(compat_a32_elf_gregset_t)) return 0; set_fs(KERNEL_DS); @@ -1130,7 +1130,7 @@ long compat_a32_arch_ptrace(struct task_struct *child, compat_long_t request, ret = copy_regset_to_user(child, &user_aarch32_view, REGSET_COMPAT_GPR, - 0, sizeof(compat_elf_gregset_t), + 0, sizeof(compat_a32_elf_gregset_t), datap); break; @@ -1138,7 +1138,7 @@ long compat_a32_arch_ptrace(struct task_struct *child, compat_long_t request, ret = copy_regset_from_user(child, &user_aarch32_view, REGSET_COMPAT_GPR, - 0, sizeof(compat_elf_gregset_t), + 0, sizeof(compat_a32_elf_gregset_t), datap); break; diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 26352a6..b239b9b 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -107,6 +107,14 @@ int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) return PTR_ERR_OR_ZERO(ret); } +#else +int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp) +{ + (void) bprm; + (void) uses_interp; + + return -EINVAL; +} #endif /* CONFIG_AARCH32_EL0 */ static struct vm_special_mapping vdso_spec[2]; -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/