From nobody Fri Mar 3 17:02:44 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4PSvRT2z2Cz3w7Db; Fri, 3 Mar 2023 17:02:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4PSvRT0Zg3z3nM1; Fri, 3 Mar 2023 17:02:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1677862965; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ERo/sI7+tZ0PiGO0KU2qQIyKUoVGR/54gooqO3ILES4=; b=TiP8K29k1NQxN7DkLzHv47hEphboC+GV3eIwrVaISbi9y4E+EkJtXRyh9c/EJxY8+E/0k6 es+tPj9mrHL7GG3XCHjbzqhJg90yEVTZrw2N5zBGaAXVQoJvR7rw/k/IDuboE1fge8Ing7 zRjLwGFeRs7X6UmuftbtB3f1oML/YzKbteWPU8mg16XN2VpSguuFEHK+19f8xtsY3hWl+i 74ruQgoyWp6t3gUuwwjHq8g9dEZ77rd9IIIiREr1e5Dqfy7f8tExHBkbAo2lvKTruiZp8s frTtIhT3gcWfAmD3BRwr0UM0OBCqoEUhlo++UA9HwNMsfvwZyVHoQKSV6xACyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1677862965; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ERo/sI7+tZ0PiGO0KU2qQIyKUoVGR/54gooqO3ILES4=; b=V9fsFeBf++ROK3FytS7c05tcDMyI2JOT0x2iD1d/yYoCD3MWm6DLvLqaEFV70CQK/uH5DX V0Zd+aTzDvkCenajnYKs1ttzzNZzLlIwsMn4M80IuboR604ebxDi6NicEOxcuj1Q3lsO3v Qw79rLWRLB0KgjuygNe4C+bepVtZmsWiGHqR/P/AjFqnyK8xS587jaGRmSo3duQDzQO0aa +GiQ+23axgV5XyNbtcfQWIJpY4pHTedEOQ82jiBXHNtAe6BWpu1CRE5esJVAgqASnvQLTl R/Sj7gblY2wBCXA0Q9oADBqrxsXIJQ6Oby0elDyE0X4B4r9hf8yYFdL8V5IosA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1677862965; a=rsa-sha256; cv=none; b=CxjfXa7E84TR5cRkdO+WDJevRpqesCVAF9NKXx+8rrWvePD+aNDPNXb+a+eTKiFVjaFJbo u9o4KUJujQDB5gZE2uQyAidQHLOyjf/rRA+6cUlnqSZelNVc3j20pyZhlNL+CNs0NK4k/Y 0p5UUSy1a1/kZC5LvptwRUyz0J+MMJfbcOmxaAIEt28Xvki713JmcRR9RgIrn/WuvhDbVb 9/FrM/uuXVwJrEIjLgRqnXR15AOR7je5Pzo7D7hIdH7gjwaZ2fhhTOLl+4msWZw4YRKahc nNfoGvyxhQRtt9+DW7VdxMLyvuuJeoIQVPfYYYq8p+w7Aau/AndeDwjylJ8lqw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4PSvRS6nTRz15Vx; Fri, 3 Mar 2023 17:02:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 323H2i0N082914; Fri, 3 Mar 2023 17:02:44 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 323H2ig9082913; Fri, 3 Mar 2023 17:02:44 GMT (envelope-from git) Date: Fri, 3 Mar 2023 17:02:44 GMT Message-Id: <202303031702.323H2ig9082913@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kyle Evans Subject: git: d2ae03bae2ad - main - arm64: disable the physical timer for now if HCR_EL2.E2H is set List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kevans X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d2ae03bae2add82124973876dec95eb126ff34c8 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=d2ae03bae2add82124973876dec95eb126ff34c8 commit d2ae03bae2add82124973876dec95eb126ff34c8 Author: Kyle Evans AuthorDate: 2023-03-03 17:02:19 +0000 Commit: Kyle Evans CommitDate: 2023-03-03 17:02:34 +0000 arm64: disable the physical timer for now if HCR_EL2.E2H is set On some hardware, we can't clear HCR_EL2.E2H so accesses to the physical timer hopelessly trap to EL2. Stash off the value of HCR_EL2 and use it in has_hyp() to avoid this. Reviewed by: andrew Differential Revision: https://reviews.freebsd.org/D38884 --- sys/arm64/arm64/genassym.c | 1 + sys/arm64/arm64/locore.S | 5 +++-- sys/arm64/arm64/machdep.c | 9 ++++++++- sys/arm64/include/machdep.h | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/sys/arm64/arm64/genassym.c b/sys/arm64/arm64/genassym.c index bd359699eca9..e444d0166360 100644 --- a/sys/arm64/arm64/genassym.c +++ b/sys/arm64/arm64/genassym.c @@ -45,6 +45,7 @@ ASSYM(BP_KERN_DELTA, offsetof(struct arm64_bootparams, kern_delta)); ASSYM(BP_KERN_STACK, offsetof(struct arm64_bootparams, kern_stack)); ASSYM(BP_KERN_TTBR0, offsetof(struct arm64_bootparams, kern_ttbr0)); ASSYM(BP_BOOT_EL, offsetof(struct arm64_bootparams, boot_el)); +ASSYM(BP_HCR_EL2, offsetof(struct arm64_bootparams, hcr_el2)); ASSYM(PCPU_SIZE, sizeof(struct pcpu)); ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb)); diff --git a/sys/arm64/arm64/locore.S b/sys/arm64/arm64/locore.S index da3001711955..1080ebc6217e 100644 --- a/sys/arm64/arm64/locore.S +++ b/sys/arm64/arm64/locore.S @@ -146,6 +146,7 @@ virtdone: str x25, [x0, #BP_KERN_STACK] str x27, [x0, #BP_KERN_TTBR0] str x23, [x0, #BP_BOOT_EL] + str x4, [x0, #BP_HCR_EL2] /* trace back starts here */ mov fp, #0 @@ -286,8 +287,8 @@ LENTRY(drop_to_el1) */ tst x4, #HCR_E2H mov x3, #CPTR_RES1 /* HCR_E2H == 0 */ - mov x4, #CPTR_FPEN /* HCR_E2H == 1 */ - csel x2, x3, x4, eq + mov x5, #CPTR_FPEN /* HCR_E2H == 1 */ + csel x2, x3, x5, eq msr cptr_el2, x2 /* Don't trap to EL2 for CP15 traps */ diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c index 19fa7cd913a0..a076bd0a046a 100644 --- a/sys/arm64/arm64/machdep.c +++ b/sys/arm64/arm64/machdep.c @@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -124,6 +125,7 @@ static struct trapframe proc0_tf; int early_boot = 1; int cold = 1; static int boot_el; +static uint64_t hcr_el2; struct kva_md_info kmi; @@ -191,7 +193,11 @@ bool has_hyp(void) { - return (boot_el == 2); + /* + * XXX The E2H check is wrong, but it's close enough for now. Needs to + * be re-evaluated once we're running regularly in EL2. + */ + return (boot_el == 2 && (hcr_el2 & HCR_E2H) == 0); } static void @@ -865,6 +871,7 @@ initarm(struct arm64_bootparams *abp) TSRAW(&thread0, TS_ENTER, __func__, NULL); boot_el = abp->boot_el; + hcr_el2 = abp->hcr_el2; /* Parse loader or FDT boot parametes. Determine last used address. */ lastaddr = parse_boot_param(abp); diff --git a/sys/arm64/include/machdep.h b/sys/arm64/include/machdep.h index 112390bb27ef..69babfff8467 100644 --- a/sys/arm64/include/machdep.h +++ b/sys/arm64/include/machdep.h @@ -36,6 +36,7 @@ struct arm64_bootparams { uint64_t kern_delta; vm_offset_t kern_stack; vm_paddr_t kern_ttbr0; + uint64_t hcr_el2; int boot_el; /* EL the kernel booted from */ int pad; };