From patchwork Wed Jul 22 14:56:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Belits X-Patchwork-Id: 1333929 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=marvell.com Authentication-Results: ozlabs.org; dkim=fail reason="key not found in DNS" header.d=marvell.com header.i=@marvell.com header.a=rsa-sha256 header.s=pfpt0818 header.b=oeXnmTgo; dkim=pass (1024-bit key; unprotected) header.d=marvell.onmicrosoft.com header.i=@marvell.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-marvell-onmicrosoft-com header.b=ugJJVEMl; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4BBdpt2wX1z9sSt for ; Thu, 23 Jul 2020 00:57:10 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732785AbgGVO5H (ORCPT ); Wed, 22 Jul 2020 10:57:07 -0400 Received: from mx0b-0016f401.pphosted.com ([67.231.156.173]:13442 "EHLO mx0b-0016f401.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732143AbgGVO5G (ORCPT ); Wed, 22 Jul 2020 10:57:06 -0400 Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 06MEmkQG012155; Wed, 22 Jul 2020 07:56:38 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=pfpt0818; bh=MjM2XCdIYkku7kyIlS/t7+DCWCHDBdJ+c56XH6d7TYY=; b=oeXnmTgo9bCLG6s0tZSe13m2nzUSfBBrdb9i+N+OhotkI5+qJFNAP56ToQkiykxbj++h ZK+t2veBQOni20E39/qR1eWGf0ya2clrxGEsNiBeHe3F5LKzCpci8VqYh3/nUACl9EK/ OxVzv6U5+E3Iv3vwFHDR+ZUWb6IPUVR9stNl0ZtHNMbEoBJ8E2IqvAU0kzEjKfLHvn+U o9F7cfhvrxJ+4gwERSY90PLvmC/ayDeUnMf+AYoCBoU7yP5NjvqTydI683ProqYtwkaM J9u1tAF0z38L1elimXqr1YzBMenKvIOtUAQ6fjRMDs0VLkGtF1UJBmv2aWiXzjbroL9R FQ== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 32c0kkrbj8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Wed, 22 Jul 2020 07:56:38 -0700 Received: from SC-EXCH01.marvell.com (10.93.176.81) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 22 Jul 2020 07:56:36 -0700 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.170) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2 via Frontend Transport; Wed, 22 Jul 2020 07:56:35 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bOPDS623+Au7ZQFxvCyDlw+Rphx0y0xLsFvPL5Lqv4gDTbyW70H7aqw/MByxuGPgF9RuTGsSus2hLqm/P9WEG+jOPJ1obd5TmT7nvtCwnqhDQgR7vCiPfWl2w6wGSb7JB1qPp60BUR+wiZUzYdyqNR+mA4fY3F5drrqB9kVbsO+H4YMwC3i58/8/yhHNtBP3kxMTLgD1IuEDLXJbX/hMLKyhWiIuVBpfTCJ+JPJULpOQbPdRPS+EeB3qzDIgyt9tNKiOyw6W34UV7I8fmV7gm3c/8lc/zn+J3mPcmuirEn1clq3o0VEfq2DJ65/d9GcWDEnjPfomIlyMcaL7ygrAhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MjM2XCdIYkku7kyIlS/t7+DCWCHDBdJ+c56XH6d7TYY=; b=BeiD/dFWNXxw61CK8yxspyVmlXbSPgJUzM0mt0UJxJQavZg7D9dtOL/IxP+XPKp8G1UiUCAN6kwMvWJRf2nasNUDjlnO0oVITWYlBHxHlPPHpIgxoMR6yY1NcrDWdHEvxXjTBaUwUOpliObSn83uVaVHSAVvUthJ9Dr6k0oJi2o6STvezX0Dn3V8LxIBFmji9jZCv+bPc9lbjypofNUz7lPUBkr3/sBDxBIHtEQxr6/aD3DV5WaLSprNek3bO5KbvXm6rfrUqtNPKBCmUWzRe8QLrVv2nre7iIzBkgxt0HSFWoAwslYANYjQYU5/RfwmMj/TzaSZK24VH7H4Eap0QQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com; dkim=pass header.d=marvell.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector1-marvell-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MjM2XCdIYkku7kyIlS/t7+DCWCHDBdJ+c56XH6d7TYY=; b=ugJJVEMlVuZ7jCBCDNeREHujm/XnBe8NfBseBS/m5J4fXRDvMj49Rhw677j9KuaozbcBdo/wLi7p7ARRW+2c63Ba1wxFkEuQqWI+iyB/5XUstrQlmeOOz1hGIeMrG/aTDkZlfHZfrd8Fd/NEQyA9a9Tb3G4O5EdmoJV2t3Np36A= Received: from MW2PR18MB2267.namprd18.prod.outlook.com (2603:10b6:907:3::11) by MW2PR18MB2156.namprd18.prod.outlook.com (2603:10b6:907:a::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3195.24; Wed, 22 Jul 2020 14:56:35 +0000 Received: from MW2PR18MB2267.namprd18.prod.outlook.com ([fe80::b9a6:a3f2:2263:dc32]) by MW2PR18MB2267.namprd18.prod.outlook.com ([fe80::b9a6:a3f2:2263:dc32%4]) with mapi id 15.20.3195.026; Wed, 22 Jul 2020 14:56:35 +0000 From: Alex Belits To: "frederic@kernel.org" , "rostedt@goodmis.org" CC: Prasun Kapoor , "mingo@kernel.org" , "davem@davemloft.net" , "linux-api@vger.kernel.org" , "peterz@infradead.org" , "linux-arch@vger.kernel.org" , "catalin.marinas@arm.com" , "tglx@linutronix.de" , "will@kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "netdev@vger.kernel.org" Subject: [PATCH v4 09/13] task_isolation: arch/arm: enable task isolation functionality Thread-Topic: [PATCH v4 09/13] task_isolation: arch/arm: enable task isolation functionality Thread-Index: AQHWYDhLQZFUyNR9D06u9QzvmRrPIw== Date: Wed, 22 Jul 2020 14:56:34 +0000 Message-ID: <8b9495dde0dc7dd0f58cc568474179cc2a7c2718.camel@marvell.com> References: <04be044c1bcd76b7438b7563edc35383417f12c8.camel@marvell.com> In-Reply-To: <04be044c1bcd76b7438b7563edc35383417f12c8.camel@marvell.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: kernel.org; dkim=none (message not signed) header.d=none;kernel.org; dmarc=none action=none header.from=marvell.com; x-originating-ip: [173.228.7.197] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 9a4b4867-134f-41d0-9fa6-08d82e4f6dbe x-ms-traffictypediagnostic: MW2PR18MB2156: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:10000; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: vjUmNBrdku6A2MSAMfYdyqRDGlBxp37Ksl55T1wRJJ44OU9z4RjeiGfXaK+Ox6S2x4lO3Ycs83R7X6Iq3WyV55Ivi9cy4D14alvvZ/VmkQ/AAPmn+WhA94paMKAX/nPEgVVEk3c1obvdVvFFrKRk7QhC1tjFMv2jjgjH/tErd95G8UC243IhL5qhe+hwqSNem65+6x4/R9kzmwQKYIlJoP+RfnGLovAaQi/zpOYsA6ogZq7n0xfKKLd6avfyQ0AmEuMv85LznRHMjoerqRJ/F95EeVeKRaYJqmnhmqYgskjRlYjqsSZwShvJlMBeIlwlG6G8uNdhdXeTE/oxcddyYA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW2PR18MB2267.namprd18.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(4636009)(39860400002)(366004)(376002)(396003)(136003)(346002)(110136005)(6486002)(2906002)(6506007)(30864003)(54906003)(66476007)(478600001)(6512007)(8936002)(2616005)(8676002)(316002)(4326008)(66946007)(186003)(64756008)(86362001)(83380400001)(76116006)(91956017)(5660300002)(66446008)(36756003)(66556008)(26005)(71200400001)(7416002);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata: KZYA/OQ23FiJyy6JG1jG/tx2AmD2MWxmehPQURrr52CpZPhGGJPYiI2IBO6SOGHKI4ehYmS1egdrOZ0QuR0tdtm4ASUg6t2WDp9luRsoa7eEnOGWJaH6ibvOhFfn88mKt5ZjaEXlf9cGAh5y/0H53QZLn4TQjnTRPs0C8EU4DNe3NMLlRwyOkbBQY6R5dJBK+9g3WPoHONfhGgkghc5g7bhNOCv6f0bQZ+8ts0SDaEIycCgJi6lxemUzm8FdH1wpF2D0iDmPjpL+19I1rkihjDUBbCAAMqN2WF4KiQH/o6/jQvOXkdgaEqmHGV4W9x/1L2Jd4xAk2G8QhtxxupPK5rM9HzaojNpzZ8cnT2HfPT1lyIqgAxPBkrYs2IoCx+YEPx1RfILGLYun/Un75blpCK1ftKe43zYqtb4Cz8+/zCEg+l4RSl1Vi0t7EyzgvgkLEwf4z8LejPV7N2i0ZbiHFb9bfnicM98oo9Wmbwp3JVM= Content-ID: MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW2PR18MB2267.namprd18.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9a4b4867-134f-41d0-9fa6-08d82e4f6dbe X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Jul 2020 14:56:34.9869 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 70e1fb47-1155-421d-87fc-2e58f638b6e0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: DJagwLVxZ/LAq+FUnkV8uRsqnBlK6UELZrFb43aKsNiBdK9utP1/Ej7A+JVab0FAnEZeKHHkEeZX4ocowYPFeQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW2PR18MB2156 X-OriginatorOrg: marvell.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.235,18.0.687 definitions=2020-07-22_08:2020-07-22,2020-07-22 signatures=0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Francis Giraldeau This patch is a port of the task isolation functionality to the arm 32-bit architecture. The task isolation needs an additional thread flag that requires to change the entry assembly code to accept a bitfield larger than one byte. The constants _TIF_SYSCALL_WORK and _TIF_WORK_MASK are now defined in the literal pool. The rest of the patch is straightforward and reflects what is done on other architectures. To avoid problems with the tst instruction in the v7m build, we renumber TIF_SECCOMP to bit 8 and let TIF_TASK_ISOLATION use bit 7. Early kernel entry relies on task_isolation_kernel_enter(). vector_swi to label __sys_trace -> syscall_trace_enter() when task isolation is enabled, -> task_isolation_kernel_enter() nvic_handle_irq() -> handle_IRQ() -> __handle_domain_irq() -> task_isolation_kernel_enter() __fiq_svc, __fiq_abt __fiq_usr -> handle_fiq_as_nmi() -> uses nmi_enter() / nmi_exit() __irq_svc -> irq_handler __irq_usr -> irq_handler irq_handler -> (handle_arch_irq or (arch_irq_handler_default -> (asm_do_IRQ() -> __handle_domain_irq()) or do_IPI() -> handle_IPI()) asm_do_IRQ() -> __handle_domain_irq() -> task_isolation_kernel_enter() do_IPI() -> handle_IPI() -> task_isolation_kernel_enter() handle_arch_irq for arm-specific controllers calls (handle_IRQ() -> __handle_domain_irq() -> task_isolation_kernel_enter()) or (handle_domain_irq() -> __handle_domain_irq() -> task_isolation_kernel_enter()) Not covered: __dabt_svc -> dabt_helper __dabt_usr -> dabt_helper dabt_helper -> CPU_DABORT_HANDLER (cpu-specific) -> do_DataAbort or PROCESSOR_DABT_FUNC -> _data_abort (cpu-specific) -> do_DataAbort __pabt_svc -> pabt_helper __pabt_usr -> pabt_helper pabt_helper -> CPU_PABORT_HANDLER (cpu-specific) -> do_PrefetchAbort or PROCESSOR_PABT_FUNC -> _prefetch_abort (cpu-specific) -> do_PrefetchAbort Signed-off-by: Francis Giraldeau Signed-off-by: Chris Metcalf [with modifications] [abelits@marvell.com: modified for kernel 5.6, added isolation cleanup] Signed-off-by: Alex Belits --- arch/arm/Kconfig | 1 + arch/arm/include/asm/barrier.h | 2 ++ arch/arm/include/asm/thread_info.h | 10 +++++++--- arch/arm/kernel/entry-common.S | 15 ++++++++++----- arch/arm/kernel/ptrace.c | 12 ++++++++++++ arch/arm/kernel/signal.c | 13 ++++++++++++- arch/arm/kernel/smp.c | 6 ++++++ arch/arm/mm/fault.c | 8 +++++++- 8 files changed, 57 insertions(+), 10 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 2ac74904a3ce..f06d0e0e4fe9 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -67,6 +67,7 @@ config ARM select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU select HAVE_ARCH_MMAP_RND_BITS if MMU select HAVE_ARCH_SECCOMP_FILTER if AEABI && !OABI_COMPAT + select HAVE_ARCH_TASK_ISOLATION select HAVE_ARCH_THREAD_STRUCT_WHITELIST select HAVE_ARCH_TRACEHOOK select HAVE_ARM_SMCCC if CPU_V7 diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h index 83ae97c049d9..3c603df6c290 100644 --- a/arch/arm/include/asm/barrier.h +++ b/arch/arm/include/asm/barrier.h @@ -66,12 +66,14 @@ extern void arm_heavy_mb(void); #define wmb() __arm_heavy_mb(st) #define dma_rmb() dmb(osh) #define dma_wmb() dmb(oshst) +#define instr_sync() isb() #else #define mb() barrier() #define rmb() barrier() #define wmb() barrier() #define dma_rmb() barrier() #define dma_wmb() barrier() +#define instr_sync() barrier() #endif #define __smp_mb() dmb(ish) diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index 3609a6980c34..ec0f11e1bb4c 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h @@ -139,7 +139,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, #define TIF_SYSCALL_TRACE 4 /* syscall trace active */ #define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */ #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ -#define TIF_SECCOMP 7 /* seccomp syscall filtering active */ +#define TIF_TASK_ISOLATION 7 /* task isolation enabled for task */ +#define TIF_SECCOMP 8 /* seccomp syscall filtering active */ #define TIF_USING_IWMMXT 17 #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ @@ -152,18 +153,21 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) +#define _TIF_TASK_ISOLATION (1 << TIF_TASK_ISOLATION) #define _TIF_SECCOMP (1 << TIF_SECCOMP) #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) /* Checks for any syscall work in entry-common.S */ #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ - _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP) + _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \ + _TIF_TASK_ISOLATION) /* * Change these and you break ASM code in entry-common.S */ #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ - _TIF_NOTIFY_RESUME | _TIF_UPROBE) + _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ + _TIF_TASK_ISOLATION) #endif /* __KERNEL__ */ #endif /* __ASM_ARM_THREAD_INFO_H */ diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 271cb8a1eba1..6ceb5cb808a9 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -53,7 +53,8 @@ __ret_fast_syscall: cmp r2, #TASK_SIZE blne addr_limit_check_failed ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing - tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK + ldr r2, =_TIF_SYSCALL_WORK | _TIF_WORK_MASK + tst r1, r2 bne fast_work_pending @@ -90,7 +91,8 @@ __ret_fast_syscall: cmp r2, #TASK_SIZE blne addr_limit_check_failed ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing - tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK + ldr r2, =_TIF_SYSCALL_WORK | _TIF_WORK_MASK + tst r1, r2 beq no_work_pending UNWIND(.fnend ) ENDPROC(ret_fast_syscall) @@ -98,7 +100,8 @@ ENDPROC(ret_fast_syscall) /* Slower path - fall through to work_pending */ #endif - tst r1, #_TIF_SYSCALL_WORK + ldr r2, =_TIF_SYSCALL_WORK + tst r1, r2 bne __sys_trace_return_nosave slow_work_pending: mov r0, sp @ 'regs' @@ -131,7 +134,8 @@ ENTRY(ret_to_user_from_irq) cmp r2, #TASK_SIZE blne addr_limit_check_failed ldr r1, [tsk, #TI_FLAGS] - tst r1, #_TIF_WORK_MASK + ldr r2, =_TIF_WORK_MASK + tst r1, r2 bne slow_work_pending no_work_pending: asm_trace_hardirqs_on save = 0 @@ -251,7 +255,8 @@ local_restart: ldr r10, [tsk, #TI_FLAGS] @ check for syscall tracing stmdb sp!, {r4, r5} @ push fifth and sixth args - tst r10, #_TIF_SYSCALL_WORK @ are we tracing syscalls? + ldr r11, =_TIF_SYSCALL_WORK @ are we tracing syscalls? + tst r10, r11 bne __sys_trace invoke_syscall tbl, scno, r10, __ret_fast_syscall diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index d0f7c8896c96..7b4fe15ba376 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -917,9 +918,20 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) { current_thread_info()->syscall = scno; + task_isolation_kernel_enter(); + if (test_thread_flag(TIF_SYSCALL_TRACE)) tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER); + /* + * In task isolation mode, we may prevent the syscall from + * running, and if so we also deliver a signal to the process. + */ + if (test_thread_flag(TIF_TASK_ISOLATION)) { + if (task_isolation_syscall(scno) == -1) + return -1; + } + /* Do seccomp after ptrace; syscall may have changed. */ #ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER if (secure_computing() == -1) diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index ab2568996ddb..29ccef8403cd 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -639,6 +640,9 @@ static int do_signal(struct pt_regs *regs, int syscall) return 0; } +#define WORK_PENDING_LOOP_FLAGS (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ + _TIF_NOTIFY_RESUME | _TIF_UPROBE) + asmlinkage int do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) { @@ -648,6 +652,9 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) * Update the trace code with the current status. */ trace_hardirqs_off(); + + task_isolation_check_run_cleanup(); + do { if (likely(thread_flags & _TIF_NEED_RESCHED)) { schedule(); @@ -676,7 +683,11 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) } local_irq_disable(); thread_flags = current_thread_info()->flags; - } while (thread_flags & _TIF_WORK_MASK); + } while (thread_flags & WORK_PENDING_LOOP_FLAGS); + + if (thread_flags & _TIF_TASK_ISOLATION) + task_isolation_start(); + return 0; } diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 9a6432557871..6a7a4ba02cc4 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -559,6 +560,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask) void arch_send_wakeup_ipi_mask(const struct cpumask *mask) { + task_isolation_remote_cpumask(mask, "wakeup IPI"); smp_cross_call(mask, IPI_WAKEUP); } @@ -578,6 +580,7 @@ void arch_irq_work_raise(void) #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST void tick_broadcast(const struct cpumask *mask) { + task_isolation_remote_cpumask(mask, "timer IPI"); smp_cross_call(mask, IPI_TIMER); } #endif @@ -633,6 +636,8 @@ void handle_IPI(int ipinr, struct pt_regs *regs) unsigned int cpu = smp_processor_id(); struct pt_regs *old_regs = set_irq_regs(regs); + task_isolation_kernel_enter(); + if ((unsigned)ipinr < NR_IPI) { trace_ipi_entry_rcuidle(ipi_types[ipinr]); __inc_irq_stat(cpu, ipi_irqs[ipinr]); @@ -701,6 +706,7 @@ void handle_IPI(int ipinr, struct pt_regs *regs) void smp_send_reschedule(int cpu) { + task_isolation_remote(cpu, "reschedule IPI"); smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); } diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index c6550eddfce1..23bb383e479e 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -330,8 +331,13 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) /* * Handle the "normal" case first - VM_FAULT_MAJOR */ - if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS)))) + if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | + VM_FAULT_BADACCESS)))) { + /* No signal was generated, but notify task-isolation tasks. */ + if (user_mode(regs)) + task_isolation_interrupt("page fault at %#lx", addr); return 0; + } /* * If we are in kernel mode at this point, we