Improve MACHINE_ARCH handling for hard vs soft-float on RISC-V.
For userland, MACHINE_ARCH reflects the current ABI via preprocessor directives. For the kernel, the hw.machine_arch sysctl uses the ELF header flags of the current process to select the correct MACHINE_ARCH value. Reviewed by: imp, kp Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D24543
This commit is contained in:
parent
03fe59bbd8
commit
ca9eb9ea4d
@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/boot.h>
|
||||
#include <sys/elf.h>
|
||||
#include <sys/jail.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/limits.h>
|
||||
|
@ -46,19 +46,17 @@
|
||||
#define MACHINE "riscv"
|
||||
#endif
|
||||
#ifndef MACHINE_ARCH
|
||||
/*
|
||||
* Check to see if we're building with hardware floating instructions
|
||||
* allowed. We check this instead of hard vs soft float ABI because we build the
|
||||
* kernel with soft float ABI to avoid hard float instruction generation. If
|
||||
* we ever allow a 'soft ABI but with hard floats' userland, then we'll need
|
||||
* to rethink this.
|
||||
*/
|
||||
#ifdef __riscv_flen
|
||||
#define MACHINE_ARCH "riscv64"
|
||||
#else
|
||||
|
||||
/* Always use the hard-float arch for the kernel. */
|
||||
#if !defined(_KERNEL) && defined(__riscv_float_abi_soft)
|
||||
#define MACHINE_ARCH "riscv64sf"
|
||||
#else
|
||||
#define MACHINE_ARCH "riscv64"
|
||||
#endif
|
||||
#endif
|
||||
#ifdef _KERNEL
|
||||
#define MACHINE_ARCHES "riscv64 riscv64sf"
|
||||
#endif
|
||||
|
||||
#ifdef SMP
|
||||
#ifndef MAXCPU
|
||||
|
@ -58,6 +58,8 @@ __FBSDID("$FreeBSD$");
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
static const char *riscv_machine_arch(struct proc *p);
|
||||
|
||||
u_long elf_hwcap;
|
||||
|
||||
struct sysentvec elf64_freebsd_sysvec = {
|
||||
@ -94,9 +96,20 @@ struct sysentvec elf64_freebsd_sysvec = {
|
||||
.sv_thread_detach = NULL,
|
||||
.sv_trap = NULL,
|
||||
.sv_hwcap = &elf_hwcap,
|
||||
.sv_machine_arch = riscv_machine_arch,
|
||||
};
|
||||
INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec);
|
||||
|
||||
static const char *
|
||||
riscv_machine_arch(struct proc *p)
|
||||
{
|
||||
|
||||
if ((p->p_elf_flags & EF_RISCV_FLOAT_ABI_MASK) ==
|
||||
EF_RISCV_FLOAT_ABI_SOFT)
|
||||
return (MACHINE_ARCH "sf");
|
||||
return (MACHINE_ARCH);
|
||||
}
|
||||
|
||||
static Elf64_Brandinfo freebsd_brand_info = {
|
||||
.brand = ELFOSABI_FREEBSD,
|
||||
.machine = EM_RISCV,
|
||||
|
Loading…
Reference in New Issue
Block a user