Add a BTI sysarch

This is used to enable the guard page when an elf binary is built with
BTI instructions.

Reviewed by:	markj
Sponsored by:	Arm Ltd
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D39453
This commit is contained in:
Andrew Turner 2023-04-05 13:45:19 +01:00
parent d3eae160b2
commit c4e4a7596b
2 changed files with 49 additions and 1 deletions

View file

@ -29,13 +29,54 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/sysproto.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
#include <machine/sysarch.h>
#include <machine/vmparam.h>
int
sysarch(struct thread *td, struct sysarch_args *uap)
{
struct arm64_guard_page_args gp_args;
vm_offset_t eva;
int error;
return (ENOTSUP);
switch (uap->op) {
case ARM64_GUARD_PAGE:
error = copyin(uap->parms, &gp_args, sizeof(gp_args));
if (error != 0)
return (error);
/* Only accept canonical addresses, no PAC or TBI */
if (!ADDR_IS_CANONICAL(gp_args.addr))
return (EINVAL);
eva = gp_args.addr + gp_args.len;
/* Check for a length overflow */
if (gp_args.addr > eva)
return (EINVAL);
/* Check in the correct address space */
if (eva >= VM_MAX_USER_ADDRESS)
return (EINVAL);
/* Nothing to do */
if (gp_args.len == 0)
return (0);
error = pmap_bti_set(vmspace_pmap(td->td_proc->p_vmspace),
trunc_page(gp_args.addr), round_page(eva));
break;
default:
error = EINVAL;
break;
}
return (error);
}

View file

@ -39,6 +39,13 @@
#ifndef _MACHINE_SYSARCH_H_
#define _MACHINE_SYSARCH_H_
#define ARM64_GUARD_PAGE 0x100
struct arm64_guard_page_args {
__uintptr_t addr;
__size_t len;
};
#ifndef _KERNEL
__BEGIN_DECLS