Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F141002515
D20493.id58178.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D20493.id58178.diff
View Options
Index: sys/riscv/include/elf.h
===================================================================
--- sys/riscv/include/elf.h
+++ sys/riscv/include/elf.h
@@ -74,4 +74,13 @@
/* TODO: set correct value */
#define ET_DYN_LOAD_ADDR 0x100000
+/* Flags passed in AT_HWCAP */
+#define HWCAP_ISA_BIT(c) (1 << ((c) - 'A'))
+#define HWCAP_ISA_I HWCAP_ISA_BIT('I')
+#define HWCAP_ISA_M HWCAP_ISA_BIT('M')
+#define HWCAP_ISA_A HWCAP_ISA_BIT('A')
+#define HWCAP_ISA_F HWCAP_ISA_BIT('F')
+#define HWCAP_ISA_D HWCAP_ISA_BIT('D')
+#define HWCAP_ISA_C HWCAP_ISA_BIT('C')
+
#endif /* !_MACHINE_ELF_H_ */
Index: sys/riscv/include/md_var.h
===================================================================
--- sys/riscv/include/md_var.h
+++ sys/riscv/include/md_var.h
@@ -38,6 +38,7 @@
extern int szsigcode;
extern uint64_t *vm_page_dump;
extern int vm_page_dump_size;
+extern u_long elf_hwcap;
struct dumperinfo;
Index: sys/riscv/riscv/elf_machdep.c
===================================================================
--- sys/riscv/riscv/elf_machdep.c
+++ sys/riscv/riscv/elf_machdep.c
@@ -58,6 +58,8 @@
#include <machine/elf.h>
#include <machine/md_var.h>
+u_long elf_hwcap;
+
struct sysentvec elf64_freebsd_sysvec = {
.sv_size = SYS_MAXSYSCALL,
.sv_table = sysent,
@@ -90,6 +92,7 @@
.sv_schedtail = NULL,
.sv_thread_detach = NULL,
.sv_trap = NULL,
+ .sv_hwcap = &elf_hwcap,
};
INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec);
Index: sys/riscv/riscv/identcpu.c
===================================================================
--- sys/riscv/riscv/identcpu.c
+++ sys/riscv/riscv/identcpu.c
@@ -32,18 +32,28 @@
* SUCH DAMAGE.
*/
+#include "opt_platform.h"
+
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
#include <sys/pcpu.h>
#include <sys/sysctl.h>
-#include <sys/systm.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
+#include <machine/elf.h>
+#include <machine/md_var.h>
#include <machine/trap.h>
+#ifdef FDT
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/openfirm.h>
+#endif
+
char machine[] = "riscv";
SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, machine, 0,
@@ -88,6 +98,83 @@
CPU_IMPLEMENTER_NONE,
};
+#ifdef FDT
+/*
+ * The ISA string is made up of a small prefix (e.g. rv64) and up to 26 letters
+ * indicating the presence of the 26 possible standard extensions. Therefore 32
+ * characters will be sufficient.
+ */
+#define ISA_NAME_MAXLEN 32
+
+static int
+fill_elf_hwcap(void)
+{
+ u_long caps[256] = {0};
+ u_long hwcap;
+ char isa[ISA_NAME_MAXLEN];
+ phandle_t node;
+ ssize_t len;
+ int i;
+
+ caps['i'] = caps['I'] = HWCAP_ISA_I;
+ caps['m'] = caps['M'] = HWCAP_ISA_M;
+ caps['a'] = caps['A'] = HWCAP_ISA_A;
+#ifdef FPE
+ caps['f'] = caps['F'] = HWCAP_ISA_F;
+ caps['d'] = caps['D'] = HWCAP_ISA_D;
+#endif
+ caps['c'] = caps['C'] = HWCAP_ISA_C;
+
+ node = OF_finddevice("/cpus");
+ if (node == -1) {
+ if (bootverbose)
+ printf("fill_elf_hwcap: Can't find cpus node\n");
+ return (ENOENT);
+ }
+
+ /*
+ * Iterate through the CPUs and examine their ISA string. While we
+ * could assign elf_hwcap to be whatever the boot CPU supports, to
+ * handle the (unusual) case of running a system with hetergeneous
+ * ISAs, keep only the extension bits that are common to all harts.
+ */
+ for (node = OF_child(node); node > 0; node = OF_peer(node)) {
+ if (!fdt_is_compatible_strict(node, "riscv")) {
+ if (bootverbose)
+ printf("fill_elf_hwcap: Can't find cpu\n");
+ return (ENOENT);
+ }
+
+ len = OF_getprop(node, "riscv,isa", (pcell_t *)isa,
+ sizeof(isa));
+ KASSERT(len <= ISA_NAME_MAXLEN, ("ISA string truncated"));
+ if (len == -1) {
+ if (bootverbose)
+ printf("fill_elf_hwcap: "
+ "Can't find riscv,isa property\n");
+ return (ENOENT);
+ }
+
+ /*
+ * The ISA string is prefixed with rvXX, where XX is the XLEN
+ * width (i.e. 32 or 64). Skip the prefix.
+ */
+ hwcap = 0;
+ for (i = 4; i < len; i++)
+ hwcap |= caps[(unsigned char)isa[i]];
+
+ if (elf_hwcap != 0)
+ elf_hwcap &= hwcap;
+ else
+ elf_hwcap = hwcap;
+ }
+
+ return (0);
+}
+
+SYSINIT(identcpu, SI_SUB_CPU, SI_ORDER_ANY, fill_elf_hwcap, NULL);
+#endif
+
void
identify_cpu(void)
{
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Dec 31, 3:19 PM (13 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27414924
Default Alt Text
D20493.id58178.diff (4 KB)
Attached To
Mode
D20493: RISC-V: expose extension bits in AT_HWCAP
Attached
Detach File
Event Timeline
Log In to Comment