From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933086AbcDYQOh (ORCPT ); Mon, 25 Apr 2016 12:14:37 -0400 Received: from mail-db3on0105.outbound.protection.outlook.com ([157.55.234.105]:45184 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932999AbcDYQOc (ORCPT ); Mon, 25 Apr 2016 12:14:32 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, Dmitry Safonov , Andy Lutomirski , Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , Alexander Viro , , Subject: [RFC 2/3] x86/coredump: use core regs, rather that TIF_IA32 flag Date: Mon, 25 Apr 2016 19:12:42 +0300 Message-ID: <1461600763-3534-2-git-send-email-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.8.0 In-Reply-To: <1461600763-3534-1-git-send-email-dsafonov@virtuozzo.com> References: <1461600763-3534-1-git-send-email-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AMSPR04CA0027.eurprd04.prod.outlook.com (10.242.87.145) To AM5PR0801MB1298.eurprd08.prod.outlook.com (10.167.216.149) X-MS-Office365-Filtering-Correlation-Id: 4f4299a1-3ccb-4ff1-5785-08d36d24acc1 X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1298;2:xbGK7KVjVSvmi/zfwgBrY5SYjNNEt+3ooK3iA7h8MupokcEGZ8rD9KT9Sqvq0Ri1SiESvvtMsCbYVx+mVX8XYq7FiUskFh+6iMIIj+ITjRN8SSqFhfVw7q+3pOpdZ2PttGWiG8V4covLzPrs4hy0S8/KhuogU3dpdyV+6AVafNzzvU0JP6y+ZJEh0xKq4d2+;3:vzDi3c64lq5wNfBDK9SEjuV1tGleACy+Q8gaJFrm+3jngDruX5K6xjgSpmUxobtvFiPxAMUWzJ+1dhFma/3nf66aim/J6/aXxYYzEJzCuLEjx2arnhOxk7i6O2H2eI9b X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1298; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1298;25:UVE2lJ2KwcQdr6zlqZrmPhl8RGNJxRy/n1An4kDJ0CVbrbtMG4sVZUHnabkGNA9aYWYpHwYYXoWAhVtjaEYLunMeqjojdYbGxykELMnVD5gB5593xt3S1m+dlNY+1WeNqFRC6++cG7HdoXfS1rWoBRtMCKyElBCRycCfn0HGEBian/3KkFLqDXDCvrhLWjnLxOEljYutREicrIIbi5iU+EpX4wdZeXRdBuJrWEx9BZzesJCSQ3jxIvoR2hDRHeW0nyZT7km6ifhs3HHHJpkNF6NpxOEl9f0jPNfThdVgud/ml5tCJXn3KMmdaXfGRq+fjZZcpk7za0zS9QpNFx/7iCoCsQR0ZSsJlGsOYvxPuiXUN3RVe0YGa08rT9lwWjRLwPw+qRyZ8uPGfAWSs5Dl84DRDT1A9sjoI44vVDNW2rj55tuiBDOQn+rnhUgoq3d9uDkFXctNfj4830s9j1JwesekD1N/cDJ4TNm8kVtfU34FLMcIptIISF+I8epEXnJhPNJsPUMauofFBeiOy0vNqql01AjrR1eKCi8jtD9vSaZW8MS8CAbDpMb04eROoQUBOts1LQx/o0dx2PxYkRPRWvdm/P6kH9EctVs3a+nJTDB7UuiP+FDDCQ25pau4NupzlN//0oI6Ot2HcN4tc0A1bg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(9101521026)(6040130)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041072)(6043046);SRVR:AM5PR0801MB1298;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1298; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1298;4:Z/IGQLRUMFa9AczRqseRdufUsNYfS4unhTVg9NjmsZ1ijps8WlS2GiTW42rjGHp395b6D/1Ed0Ju+PosPHqkJLYAdNNetsM82eHyAAB6h1/ntP59clDoz1UNY6C1DmAW/GfHz6v6ETVRH6LkTDmileCuy86RiVqo/aDT+wF5H6Nd4eaempVp8ROCgiovUJxGKqzjCA8IjKP7KqE1CIJ0wcEvatXZsUiAEMU7GulD7WDnb3YR6H5TiLOpIooDP016js/NEUJqxpZPS10WZPXQYYRJ8arTWcHm43EBbYEgVYjayixdnS5xOAAk4uDkeJk+ACvgoQ7MgLTyY6HdK1odD13uSiNi1ot9vMLphvePJpCC3SAwif+6G2CvfawdJZDtiQbbX9nZr/Ila7pmz+IssDYKqNQLJ2USJbBIfalDQZUOcwBiGo+n+MiuLZ0BVH3s X-Forefront-PRVS: 0923977CCA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(77096005)(2351001)(189998001)(110136002)(5004730100002)(50986999)(76176999)(47776003)(66066001)(229853001)(2950100001)(36756003)(5008740100001)(5003940100001)(2906002)(92566002)(86362001)(575784001)(1096002)(3846002)(586003)(6116002)(4326007)(19580395003)(19580405001)(42186005)(53416004)(48376002)(81166005)(33646002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0801MB1298;H:dsafonov.sw.ru;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1298;23:E4yj9ccZ/OpQ3336d6DMLTOYOH8OCQ/PNWT6qJ1OlOGPB09UncFH9fRI5gsfXGmxOrQTziC81cnNvqB8s/XE9j4mrsrgTT+fRwdXpIwHkHdXJyjRoG070aFwWWduwAjaSlC6KVp4vaSGKN6EQp+XjcaNGWazkHbvF/CJJWaFw+zUzeswZzJIre0SnrCcm/Br8ekhokWuenjyeWskzmJ4vb7L4hpAorAmXthLzdi/W+2anUFx6UV9MIp2i03U2NbxBX1VIHoo8y9CzzAlqUObmx9DaQ7VXdeMJwMgLYMq81UkwWQPKCXrrf1dxoSxauBQUrULMV9siMHUnga7/tRRWPlpGRGBnBbxHH6NI5eV3W6gl+FFooaX7SihJbGhVZjatovPDcnT+uaLzG3VOujeCYJ4E7JthB7PfoVZPTb6qrec3JFwhQI6DOnCXcN3qA9yPYwr4PDkmjFwRetK74GdP7RqsuAyXJUeL8h6+E/FuBO8JayNa4+1AtqqwWI0r0zLV1TIpThcRTelYSPhzKachqPSs9SHknuaQYiqdAjx8pc0h+XeEU4Ayh5dDY3UBmXUQN6vTBlIh9C2UvgQieE7eYBmZqR1uyOhe5RwR0YclLY6x9MITSdWtN6vms6yi7vFkxO8RCJ2jhFV5Hp7TxOsruY8Q6Ov4noWqYvv0M/kzfhDH/eRP7QcMR7hlcVDypCAhdreP8WDzj7CtpcEhjfEulWOigYPC+w21bxXc6teGEnW6/Oe3BWN6aeGfDMS7nu/UD8c1Ec2eBTuobj/JPJ2RL2EwbQDjOdynT28JS5hvH2/kZPwyMsBeM2tGT0IVFf8rQP5YTFd9ikDMjthLUIkLma2JQstXA/HtPGpeV9lFPjxQhWAHKnhxXOQ1RMxs/Tv X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1298;5:m69nIjyY1YGm7ztPcXIIVY4nqAbdMg08gHubqZeur7SDGxkgT1YgyIxePBGVrXMOw0pvbdJyddO88VFELsO1IpJ24iTq/fkEpm6wbw2zsgisKIdlbsL1N2EdqQcNkqLX/cOC8prBPmVmoVzmgGOcFMuMpbtm7n9EVvurk8iBsASe70S6ss1zkR7xENUMXiXm;24:QqyEuPi/RclV8enFYYffZK4o7wU3Z/NPbA81cBcXHfH4afXcgm0vAKK1wynqOpcpI2pOi+F/4n0utU/z6SAQeyWw1KXwd/QephBEe3IvbP4=;7:7t8INNbURJvnM4PeEAjV3aUn2udNcLF+HKTtHXVJOI8kEz3L2SJZJpfUarrpFW9ofodOVroIccYkdzdunqfK9pIB7m7od0dkbSVm6eX2D6GngoihD5VV2i3qObGO5tq1xkQ2EAYLn1LKrtbQuPi788VHx58hUhablzhlugg5jxuohf0/lOTeJMaxKs1Y2FTctpyB+FwwlQ0UqAEUan5/m7qvzup1gnMeM03k5P1nM18=;20:d8D+sOxztRTYlmrCwEv3uSum2+S4ZciV7lSPzawdr1agU6TcTqy0+vSRSFw0EKrHOuHMgArZwKhAz+Fj548EFbme/Qt9W4tVNzUtpIeF+oDWWcTgdKNiMbXqHKxWzuivB4Lhb4GAiSSfC0t6wCH34fqQiUUuPk1StHKTSd8LjYQ= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Apr 2016 16:14:26.8348 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0801MB1298 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As we have here core registers, use them to determine application's mode and sizes of register set and elf_prstatus. Cc: Andy Lutomirski Cc: Ingo Molnar Cc: Thomas Gleixner Cc: "H. Peter Anvin" Cc: Alexander Viro Cc: x86@kernel.org Cc: linux-fsdevel@vger.kernel.org Signed-off-by: Dmitry Safonov --- arch/x86/include/asm/compat.h | 8 ++++---- fs/binfmt_elf.c | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h index 5a3b2c119ed0..d0b517fc77ff 100644 --- a/arch/x86/include/asm/compat.h +++ b/arch/x86/include/asm/compat.h @@ -264,10 +264,10 @@ struct compat_shmid64_ds { #ifdef CONFIG_X86_X32_ABI typedef struct user_regs_struct compat_elf_gregset_t; -#define PR_REG_SIZE(S) (test_thread_flag(TIF_IA32) ? 68 : 216) -#define PRSTATUS_SIZE(S) (test_thread_flag(TIF_IA32) ? 144 : 296) -#define SET_PR_FPVALID(S,V) \ - do { *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE(0)) = (V); } \ +#define PR_REG_SIZE(S, R) (!user_64bit_mode(R) ? 68 : 216) +#define PRSTATUS_SIZE(S, R) (!user_64bit_mode(R) ? 144 : 296) +#define SET_PR_FPVALID(S, V, R) \ + do { *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE(0, R)) = (V); } \ while (0) #define COMPAT_USE_64BIT_TIME \ diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 81381cc0dd17..6be281ef34f9 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1621,11 +1621,11 @@ static void do_thread_regset_writeback(struct task_struct *task, } #ifndef PR_REG_SIZE -#define PR_REG_SIZE(S) sizeof(S) +#define PR_REG_SIZE(S, R) sizeof(S) #endif #ifndef PRSTATUS_SIZE -#define PRSTATUS_SIZE(S) sizeof(S) +#define PRSTATUS_SIZE(S, R) sizeof(S) #endif #ifndef PR_REG_PTR @@ -1633,12 +1633,13 @@ static void do_thread_regset_writeback(struct task_struct *task, #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, const struct user_regset_view *view, - long signr, size_t *total) + long signr, size_t *total, + struct pt_regs *regs __maybe_unused) { unsigned int i; @@ -1650,11 +1651,11 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, */ 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), + 0, PR_REG_SIZE(t->prstatus.pr_reg, regs), PR_REG_PTR(&t->prstatus), NULL); fill_note(&t->notes[0], "CORE", NT_PRSTATUS, - PRSTATUS_SIZE(t->prstatus), &t->prstatus); + PRSTATUS_SIZE(t->prstatus, regs), &t->prstatus); *total += notesize(&t->notes[0]); do_thread_regset_writeback(t->task, &view->regsets[0]); @@ -1684,7 +1685,7 @@ 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, regs); fill_note(&t->notes[i], "CORE", NT_PRFPREG, size, data); } @@ -1770,7 +1771,8 @@ static int fill_note_info(struct elfhdr *elf, int phdrs, * Now fill in each thread's information. */ for (t = info->thread; t != NULL; t = t->next) - if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size)) + if (!fill_thread_core_info(t, view, siginfo->si_signo, + &info->size, regs)) return 0; /* -- 2.8.0