From nobody Wed Aug 31 10:58:18 2022 X-Original-To: dev-commits-src-main@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 4MHh3v16c3z4b2CP; Wed, 31 Aug 2022 10:58:19 +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 4MHh3v0f6Wz49th; Wed, 31 Aug 2022 10:58:19 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1661943499; 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=tUnWGGzS6aAfoigFja0CTgSJzX08spi9Uaf18lQAh+Y=; b=HQC+IMxOTU9A+Ic0dKQQI18MMTm5DesoYqtRQW1rGKV2ujpJ2QeM0aU69m41oShjJwriVX bS72O/ptAlPuF0ml9OLSsWGBtfAxYLNEnNBrR1NP9LOAVHZPQK5ud1pn2ISAnzGEy2rdI0 wZ42hbQRxSfOI5l3O5J/VnrFjzoIR4dCm1PvggGj1goi0yerI2/BgRqLY883yy72qT6Ci0 bC5sqH/U8Zx/eI/2ZLhre1abDsN567MGcUWxKd0k+3tmiR7/FmydXX1AD1Jt+wu4K87mp9 6H9wmhiAsT+WV6iSIbXzAZkvbJk3L27OLUnghCgzX5/pqPYNLAZ6DYrxvpNRAw== 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 4MHh3t6P2Pz166T; Wed, 31 Aug 2022 10:58:18 +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 27VAwIDB029360; Wed, 31 Aug 2022 10:58:18 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 27VAwIAm029359; Wed, 31 Aug 2022 10:58:18 GMT (envelope-from git) Date: Wed, 31 Aug 2022 10:58:18 GMT Message-Id: <202208311058.27VAwIAm029359@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 544f047f8940 - main - Store mpidr as a 64-bit value on arm64 List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 544f047f894046a68c373f55ddd072e91bcfbf38 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1661943499; 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=tUnWGGzS6aAfoigFja0CTgSJzX08spi9Uaf18lQAh+Y=; b=s2pKKICwlA3Vo9p818c5zQPaLvBFz/tRqVCGMjRtDF7ShPVSBp8tXoGlAYA1mVpKD+naez 96MQZtmWQSIJ6H1PQqxEMRORvK+Wplirv4QCXvTiQq9CN8MBHXP0pt9wc+FPyvk+QUyg0C ByT9Nf9QUtMm+sHfJkYzyapImpZbI45zRWjj0jYPk5NBK6wwY6NgCChGkJCRpWPgjqahcu 5TTDyui06t4xwk1WwEo4RIjxi+30kOkHHHW2Q1kEejARUNHSTMNRwQQqARbwCitMaOBxhh VBE0re4ckiWZCLxUJKqnmE7ZHrG70y7CQprxkZCVcys3XURs31HFOXQHOZw57g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1661943499; a=rsa-sha256; cv=none; b=pqiB0eQtGgcT41hJkA4NgBghHzatgZw2UI6GGwS5Q7ojfKwr/pbdpBGOVxMGd00lJ6xbKi dAhe0tp6DkJUwY704qFRYe1N32MnqVUI2mbgMmjktQIgUgd/6ZDWaglB8dOLDo92CCoQLv zaKeIdQZ3K/zLJr6SzowICPxEFUNODtUeE2KLHYUd3jhQWoJRz9xoH66DXYiJQ9gDGW6Sv cMMN4tPTp7GoVKHQujkA3L/+6325CkthxNq+ujWh2LF5PxjxAJPdCZ3QE06KyfSERN/TBm pe5dkC+NOeoDnbNhGvUXWSbjUOnLBvFYhX8RiH8j9mVOvIaZUfzk6zKkNyOQAw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=544f047f894046a68c373f55ddd072e91bcfbf38 commit 544f047f894046a68c373f55ddd072e91bcfbf38 Author: Andrew Turner AuthorDate: 2022-08-25 08:28:28 +0000 Commit: Andrew Turner CommitDate: 2022-08-31 10:48:31 +0000 Store mpidr as a 64-bit value on arm64 The mpidr register is 64 bit on arm64 and 32 bit on arm. Fix this by extending the arm64 definition to include the top 32 bits. To preserve KBI when MFCing split the value into two 32 bit values. This will be cleaned up later only on main. Reviewed by: bz Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D36346 --- sys/arm/arm/pmu_acpi.c | 2 +- sys/arm/arm/pmu_fdt.c | 2 +- sys/arm/include/pcpu.h | 2 ++ sys/arm64/arm64/machdep.c | 3 ++- sys/arm64/arm64/mp_machdep.c | 17 +++++++++++------ sys/arm64/include/pcpu.h | 9 +++++++-- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/sys/arm/arm/pmu_acpi.c b/sys/arm/arm/pmu_acpi.c index 2e031338f144..8812ac7b3af4 100644 --- a/sys/arm/arm/pmu_acpi.c +++ b/sys/arm/arm/pmu_acpi.c @@ -72,7 +72,7 @@ madt_handler(ACPI_SUBTABLE_HEADER *entry, void *arg) for (i = 0; i < MAXCPU; i++) { pcpu = pcpu_find(i); - if (pcpu != NULL && pcpu->pc_mpidr == intr->ArmMpidr) { + if (pcpu != NULL && PCPU_GET_MPIDR(pcpu) == intr->ArmMpidr) { cpuid = i; break; } diff --git a/sys/arm/arm/pmu_fdt.c b/sys/arm/arm/pmu_fdt.c index 0b435375aa22..fef15e106a33 100644 --- a/sys/arm/arm/pmu_fdt.c +++ b/sys/arm/arm/pmu_fdt.c @@ -105,7 +105,7 @@ pmu_parse_affinity(device_t dev, struct pmu_softc *sc, struct pmu_intr *irq, for (i = 0; i < MAXCPU; i++) { pcpu = pcpu_find(i); - if (pcpu != NULL && pcpu->pc_mpidr == mpidr) { + if (pcpu != NULL && PCPU_GET_MPIDR(pcpu) == mpidr) { irq->cpuid = i; return (0); } diff --git a/sys/arm/include/pcpu.h b/sys/arm/include/pcpu.h index 2353b1d06b17..ced701516c70 100644 --- a/sys/arm/include/pcpu.h +++ b/sys/arm/include/pcpu.h @@ -139,6 +139,8 @@ set_tls(void *tls) #define PCPU_PTR(member) (&get_pcpu()->pc_ ## member) #define PCPU_SET(member,value) (get_pcpu()->pc_ ## member = (value)) +#define PCPU_GET_MPIDR(pc) ((pc)->pc_mpidr) + void pcpu0_init(void); #endif /* _KERNEL */ diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c index 5ce5d279e8e0..c47e16e6b2b6 100644 --- a/sys/arm64/arm64/machdep.c +++ b/sys/arm64/arm64/machdep.c @@ -300,7 +300,8 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size) { pcpu->pc_acpi_id = 0xffffffff; - pcpu->pc_mpidr = 0xffffffff; + pcpu->pc_mpidr_low = 0xffffffff; + pcpu->pc_mpidr_high = 0xffffffff; } void diff --git a/sys/arm64/arm64/mp_machdep.c b/sys/arm64/arm64/mp_machdep.c index a6e2be300bae..d1fbb4c079d2 100644 --- a/sys/arm64/arm64/mp_machdep.c +++ b/sys/arm64/arm64/mp_machdep.c @@ -153,7 +153,7 @@ static bool is_boot_cpu(uint64_t target_cpu) { - return (cpuid_to_pcpu[0]->pc_mpidr == (target_cpu & CPU_AFF_MASK)); + return (PCPU_GET_MPIDR(cpuid_to_pcpu[0]) == (target_cpu & CPU_AFF_MASK)); } static void @@ -207,7 +207,7 @@ init_secondary(uint64_t cpu) { struct pcpu *pcpup; pmap_t pmap0; - u_int mpidr; + uint64_t mpidr; ptrauth_mp_start(cpu); @@ -218,10 +218,10 @@ init_secondary(uint64_t cpu) */ mpidr = READ_SPECIALREG(mpidr_el1) & CPU_AFF_MASK; if (cpu >= MAXCPU || cpuid_to_pcpu[cpu] == NULL || - cpuid_to_pcpu[cpu]->pc_mpidr != mpidr) { + PCPU_GET_MPIDR(cpuid_to_pcpu[cpu]) != mpidr) { for (cpu = 0; cpu < mp_maxid; cpu++) if (cpuid_to_pcpu[cpu] != NULL && - cpuid_to_pcpu[cpu]->pc_mpidr == mpidr) + PCPU_GET_MPIDR(cpuid_to_pcpu[cpu]) == mpidr) break; if ( cpu >= MAXCPU) panic("MPIDR for this CPU is not in pcpu table"); @@ -517,7 +517,8 @@ start_cpu(u_int cpuid, uint64_t target_cpu, int domain) pcpup = (struct pcpu *)pcpu_mem; pcpu_init(pcpup, cpuid, sizeof(struct pcpu)); - pcpup->pc_mpidr = target_cpu & CPU_AFF_MASK; + pcpup->pc_mpidr_low = target_cpu & CPU_AFF_MASK; + pcpup->pc_mpidr_high = (target_cpu & CPU_AFF_MASK) >> 32; dpcpu[cpuid - 1] = (void *)(pcpup + 1); dpcpu_init(dpcpu[cpuid - 1], cpuid); @@ -688,11 +689,15 @@ cpu_init_fdt(void) void cpu_mp_start(void) { + uint64_t mpidr; + mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN); /* CPU 0 is always boot CPU. */ CPU_SET(0, &all_cpus); - cpuid_to_pcpu[0]->pc_mpidr = READ_SPECIALREG(mpidr_el1) & CPU_AFF_MASK; + mpidr = READ_SPECIALREG(mpidr_el1) & CPU_AFF_MASK; + cpuid_to_pcpu[0]->pc_mpidr_low = mpidr; + cpuid_to_pcpu[0]->pc_mpidr_high = mpidr >> 32; switch(arm64_bus_method) { #ifdef DEV_ACPI diff --git a/sys/arm64/include/pcpu.h b/sys/arm64/include/pcpu.h index b93f3b2e4816..8d60b4ef6356 100644 --- a/sys/arm64/include/pcpu.h +++ b/sys/arm64/include/pcpu.h @@ -48,8 +48,10 @@ struct debug_monitor_state; struct pmap *pc_curpmap; \ struct pmap *pc_curvmpmap; \ u_int pc_bcast_tlbi_workaround; \ - u_int pc_mpidr; /* stored MPIDR value */ \ - char __pad[201] + /* Store as two u_int values to preserve KBI */ \ + u_int pc_mpidr_low; /* lower MPIDR 32 bits */ \ + u_int pc_mpidr_high; /* upper MPIDR 32 bits */ \ + char __pad[197] #ifdef _KERNEL @@ -83,6 +85,9 @@ get_curthread(void) #define PCPU_PTR(member) (&pcpup->pc_ ## member) #define PCPU_SET(member,value) (pcpup->pc_ ## member = (value)) +#define PCPU_GET_MPIDR(pc) \ + ((((uint64_t)((pc)->pc_mpidr_high)) << 32) | ((pc)->pc_mpidr_low)) + #endif /* _KERNEL */ #endif /* !_MACHINE_PCPU_H_ */