From nobody Mon Mar 3 16:12:31 2025 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 4Z63k76tSfz5pjR9; Mon, 03 Mar 2025 16:12:31 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Z63k7494Rz40V8; Mon, 03 Mar 2025 16:12:31 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1741018351; 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=Is0vRIVR57w4u2WHBip5byzR7IqR+cnTtr4aXLgdLq8=; b=BNGFWIJ6sTwWBUNS7xbqIN4px8Rwx2FB9H5HNix5yNbkjAbm/Y/w6X+vY/g7pTrBLrDlDM P9HamfXHqaMVOx8FE0W2fqM4Fqmswd28LiJGOJAG7v41takY+3+6vLl1H/GZnmw9h/1FBb HMzB30yW17ner34r+VGtJBtsCxLc133qvFIBfI/X6BYw3R5pbzjC0nY1OdXV4p9xJL6+B1 AJL+Ao3moBkFELfyRIxpraLdhX7JOgq0rLmgx2bPSGeHzX7xt0Ex/msluEFJC7BhFHalae BiUfLUIWH/95APLsnUIjiwrXhzB3cpURdDIzEfz6l/qSnz+ZhELA24siAB+otg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1741018351; a=rsa-sha256; cv=none; b=gWBJSXAUFUfYK5sPT+dMZELF/jFjNR0Z6nSnRXAa2pQlYDXcOUW6o8OJOIF3DDU1iQen2R c5xO1icyNYgn43j+z+FzxLbDrwk5zI6uvRQiiKY6rCPXI23XgMTy5AJs+TEpBLjFx54jm2 eHLnr8g+pEkUWCYi4UBwp5JLKiTUj82atE5jEWpksxNrMDKe7kZ8G5lXEdcvbAhSZe78u7 32rhsc77BVwmLkf9lJMULAP3rQc3g05BO1c5Ikq4Hbp78A+qoWD1WWldDENlNhV79Nn7zC /4s5QI2a8eYf/IwCFR+qyqOXnU3ZC2YcrsGKudAey4xu8r7ZG3J+GpeHPQGa8A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1741018351; 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=Is0vRIVR57w4u2WHBip5byzR7IqR+cnTtr4aXLgdLq8=; b=YH3ct6QDkuTORoTIOCDdqR3/YlJiQoWYaCwhwB9eBqAsNyXFySd+ttwa1dfnKafujqhfnw Utxi6K9Rz30C24bnW90/G4owqrxpbHhRPFFPVyKECjTmXrg+8S4c7STcbu/Age8kk/AGV5 0nT9P+oz/BtRQ3XarbmsDlTxYPovGyMCOqr16lJalVATdr+NzmipEFyxoxG4MzxIV2K5OD YTFSxzfREiKPnk8dgoiEsMwX02WgzrrZaG0xyx0OQm9qEWzAQBvMdK7uVcZE5hQyInrSSW xeMzDPvuTsv2RJXvO8JHfAyE2hHSUKcJZ9dCyfqL/Hg8d/YIyOUkf8tUi0OUNw== 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 4Z63k73jLSzv4h; Mon, 03 Mar 2025 16:12:31 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 523GCVOA008225; Mon, 3 Mar 2025 16:12:31 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 523GCV5C008222; Mon, 3 Mar 2025 16:12:31 GMT (envelope-from git) Date: Mon, 3 Mar 2025 16:12:31 GMT Message-Id: <202503031612.523GCV5C008222@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mitchell Horne Subject: git: 04a812ae94e4 - main - riscv/stand: pass boot hart in loader metadata 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: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mhorne X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 04a812ae94e44982ee7f86e5de8a5caccdbc8a81 Auto-Submitted: auto-generated The branch main has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=04a812ae94e44982ee7f86e5de8a5caccdbc8a81 commit 04a812ae94e44982ee7f86e5de8a5caccdbc8a81 Author: Mitchell Horne AuthorDate: 2025-03-03 15:47:23 +0000 Commit: Mitchell Horne CommitDate: 2025-03-03 16:12:15 +0000 riscv/stand: pass boot hart in loader metadata Use the RISCV_EFI_BOOT_PROTOCOL to fetch the boot hart ID, and communicate this to the kernel via new metadata field (MODINFOMD_BOOT_HART). If the boot hart is not found this way, fall back to the (now deprecated) device-tree method. The assumption that a hart ID can be represented with a 32-bit unsigned integer is unchanged in the kernel, but from the loader we pass the full 64-bit value. This ensures that this API won't need to change in the future, should the wider value become necessary. Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D48887 --- stand/efi/loader/arch/riscv/exec.c | 25 ++++++++++++++++ sys/kern/subr_module.c | 10 +++++++ sys/riscv/include/metadata.h | 1 + sys/riscv/riscv/machdep.c | 61 +++++++++++++++++++++++++------------- 4 files changed, 77 insertions(+), 20 deletions(-) diff --git a/stand/efi/loader/arch/riscv/exec.c b/stand/efi/loader/arch/riscv/exec.c index 0fc28cba78c1..9da61229ef68 100644 --- a/stand/efi/loader/arch/riscv/exec.c +++ b/stand/efi/loader/arch/riscv/exec.c @@ -2,6 +2,7 @@ * Copyright (c) 2001 Benno Rice * Copyright (c) 2007 Semihalf, Rafal Jaworowski * All rights reserved. + * Copyright (c) 2024 The FreeBSD Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -40,6 +41,28 @@ #include "bootstrap.h" #include "loader_efi.h" +static void +riscv_set_boot_hart(struct preloaded_file *fp) +{ + EFI_GUID riscvboot = RISCV_EFI_BOOT_PROTOCOL_GUID; + RISCV_EFI_BOOT_PROTOCOL *proto; + EFI_STATUS status = 0; + uint64_t boot_hartid = ULONG_MAX; + + status = BS->LocateProtocol(&riscvboot, NULL, (void **)&proto); + if (EFI_ERROR(status)) { + return; + } + + status = proto->GetBootHartId(proto, &boot_hartid); + if (EFI_ERROR(status)) { + return; + } + + file_addmetadata(fp, MODINFOMD_BOOT_HARTID, sizeof(boot_hartid), + &boot_hartid); +} + static int __elfN(exec)(struct preloaded_file *fp) { @@ -52,6 +75,8 @@ __elfN(exec)(struct preloaded_file *fp) if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) return (EFTYPE); + riscv_set_boot_hart(fp); + e = (Elf_Ehdr *)&fmp->md_data; efi_time_fini(); diff --git a/sys/kern/subr_module.c b/sys/kern/subr_module.c index 596961606577..d07990cebdc3 100644 --- a/sys/kern/subr_module.c +++ b/sys/kern/subr_module.c @@ -442,6 +442,11 @@ preload_modinfo_type(struct sbuf *sbp, int type) case MODINFOMD_SPLASH: sbuf_cat(sbp, "MODINFOMD_SPLASH"); break; +#endif +#ifdef MODINFOMD_BOOT_HARTID + case MODINFOMD_BOOT_HARTID: + sbuf_cat(sbp, "MODINFOMD_BOOT_HARTID"); + break; #endif default: sbuf_cat(sbp, "unrecognized metadata type"); @@ -503,6 +508,11 @@ preload_modinfo_value(struct sbuf *sbp, uint32_t *bptr, int type, int len) case MODINFO_METADATA | MODINFOMD_HOWTO: sbuf_printf(sbp, "0x%08x", *bptr); break; +#ifdef MODINFOMD_BOOT_HARTID + case MODINFO_METADATA | MODINFOMD_BOOT_HARTID: + sbuf_printf(sbp, "0x%lu", *(uint64_t *)bptr); + break; +#endif case MODINFO_METADATA | MODINFOMD_SHDR: case MODINFO_METADATA | MODINFOMD_ELFHDR: case MODINFO_METADATA | MODINFOMD_FW_HANDLE: diff --git a/sys/riscv/include/metadata.h b/sys/riscv/include/metadata.h index 6ade03e15ea3..ddbad3fae3b4 100644 --- a/sys/riscv/include/metadata.h +++ b/sys/riscv/include/metadata.h @@ -31,6 +31,7 @@ #define MODINFOMD_DTBP 0x1001 #define MODINFOMD_EFI_MAP 0x1002 #define MODINFOMD_EFI_FB 0x1003 +#define MODINFOMD_BOOT_HARTID 0x1004 struct efi_map_header { size_t memory_size; diff --git a/sys/riscv/riscv/machdep.c b/sys/riscv/riscv/machdep.c index 03f5926c3739..fea4ca9a7b92 100644 --- a/sys/riscv/riscv/machdep.c +++ b/sys/riscv/riscv/machdep.c @@ -419,6 +419,45 @@ fake_preload_metadata(struct riscv_bootparams *rvbp) /* Support for FDT configurations only. */ CTASSERT(FDT); +static void +parse_boot_hartid(void) +{ + uint64_t *mdp; +#ifdef FDT + phandle_t chosen; + uint32_t hart; +#endif + + mdp = (uint64_t *)preload_search_info(preload_kmdp, + MODINFO_METADATA | MODINFOMD_BOOT_HARTID); + if (mdp != NULL && *mdp < UINT32_MAX) { + boot_hart = (uint32_t)*mdp; + goto out; + } + +#ifdef FDT + /* + * Deprecated: + * + * Look for the boot hart ID. This was either passed in directly from + * the SBI firmware and handled by locore, or was stored in the device + * tree by an earlier boot stage. + */ + chosen = OF_finddevice("/chosen"); + if (OF_getencprop(chosen, "boot-hartid", &hart, sizeof(hart)) != -1) { + boot_hart = hart; + } +#endif + + /* We failed... */ + if (boot_hart == BOOT_HART_INVALID) { + panic("Boot hart ID was not properly set"); + } + +out: + PCPU_SET(hart, boot_hart); +} + #ifdef FDT static void parse_fdt_bootargs(void) @@ -462,6 +501,8 @@ parse_metadata(void) if (kern_envp == NULL) parse_fdt_bootargs(); #endif + parse_boot_hartid(); + return (lastaddr); } @@ -474,10 +515,6 @@ initriscv(struct riscv_bootparams *rvbp) int mem_regions_sz; vm_offset_t lastaddr; vm_size_t kernlen; -#ifdef FDT - phandle_t chosen; - uint32_t hart; -#endif char *env; TSRAW(&thread0, TS_ENTER, __func__, NULL); @@ -502,22 +539,6 @@ initriscv(struct riscv_bootparams *rvbp) } lastaddr = parse_metadata(); -#ifdef FDT - /* - * Look for the boot hart ID. This was either passed in directly from - * the SBI firmware and handled by locore, or was stored in the device - * tree by an earlier boot stage. - */ - chosen = OF_finddevice("/chosen"); - if (OF_getencprop(chosen, "boot-hartid", &hart, sizeof(hart)) != -1) { - boot_hart = hart; - } -#endif - if (boot_hart == BOOT_HART_INVALID) { - panic("Boot hart ID was not properly set"); - } - pcpup->pc_hart = boot_hart; - efihdr = (struct efi_map_header *)preload_search_info(preload_kmdp, MODINFO_METADATA | MODINFOMD_EFI_MAP); if (efihdr != NULL) {