svn commit: r364535 - head/usr.bin/proccontrol
Konstantin Belousov
kib at FreeBSD.org
Sun Aug 23 20:44:16 UTC 2020
Author: kib
Date: Sun Aug 23 20:44:15 2020
New Revision: 364535
URL: https://svnweb.freebsd.org/changeset/base/364535
Log:
procctl(8): usermode bits to force LA58/LA57 on exec.
Sponsored by: The FreeBSD Foundation
Differential revision: https://reviews.freebsd.org/D25273
Modified:
head/usr.bin/proccontrol/proccontrol.1
head/usr.bin/proccontrol/proccontrol.c
Modified: head/usr.bin/proccontrol/proccontrol.1
==============================================================================
--- head/usr.bin/proccontrol/proccontrol.1 Sun Aug 23 20:43:23 2020 (r364534)
+++ head/usr.bin/proccontrol/proccontrol.1 Sun Aug 23 20:44:15 2020 (r364535)
@@ -71,6 +71,9 @@ Controls the implicit PROT_MAX application for
.Xr mmap 2 .
.It Ar kpti
Controls the KPTI enable, AMD64 only.
+.It Ar la48
+Control limiting usermode process address space to 48 bits of address,
+AMD64 only, on machines capable of 57-bit addressing.
.El
.Pp
The
Modified: head/usr.bin/proccontrol/proccontrol.c
==============================================================================
--- head/usr.bin/proccontrol/proccontrol.c Sun Aug 23 20:43:23 2020 (r364534)
+++ head/usr.bin/proccontrol/proccontrol.c Sun Aug 23 20:44:15 2020 (r364535)
@@ -48,6 +48,10 @@ enum {
#ifdef PROC_KPTI_CTL
MODE_KPTI,
#endif
+#ifdef PROC_LA_CTL
+ MODE_LA57,
+ MODE_LA48,
+#endif
};
static pid_t
@@ -69,13 +73,18 @@ str2pid(const char *str)
#else
#define KPTI_USAGE
#endif
+#ifdef PROC_LA_CTL
+#define LA_USAGE "|la48|la57"
+#else
+#define LA_USAGE
+#endif
static void __dead2
usage(void)
{
fprintf(stderr, "Usage: proccontrol -m (aslr|protmax|trace|trapcap|"
- "stackgap"KPTI_USAGE") [-q] "
+ "stackgap"KPTI_USAGE LA_USAGE") [-q] "
"[-s (enable|disable)] [-p pid | command]\n");
exit(1);
}
@@ -108,6 +117,12 @@ main(int argc, char *argv[])
else if (strcmp(optarg, "kpti") == 0)
mode = MODE_KPTI;
#endif
+#ifdef PROC_LA_CTL
+ else if (strcmp(optarg, "la57") == 0)
+ mode = MODE_LA57;
+ else if (strcmp(optarg, "la48") == 0)
+ mode = MODE_LA48;
+#endif
else
usage();
break;
@@ -164,6 +179,12 @@ main(int argc, char *argv[])
error = procctl(P_PID, pid, PROC_KPTI_STATUS, &arg);
break;
#endif
+#ifdef PROC_LA_CTL
+ case MODE_LA57:
+ case MODE_LA48:
+ error = procctl(P_PID, pid, PROC_LA_STATUS, &arg);
+ break;
+#endif
default:
usage();
break;
@@ -259,6 +280,27 @@ main(int argc, char *argv[])
printf(", not active\n");
break;
#endif
+#ifdef PROC_LA_CTL
+ case MODE_LA57:
+ case MODE_LA48:
+ switch (arg & ~(PROC_LA_STATUS_LA48 |
+ PROC_LA_STATUS_LA57)) {
+ case PROC_LA_CTL_LA48_ON_EXEC:
+ printf("la48 on exec");
+ break;
+ case PROC_LA_CTL_LA57_ON_EXEC:
+ printf("la57 on exec");
+ break;
+ case PROC_LA_CTL_DEFAULT_ON_EXEC:
+ printf("default on exec");
+ break;
+ }
+ if ((arg & PROC_LA_STATUS_LA48) != 0)
+ printf(", la48 active\n");
+ else if ((arg & PROC_LA_STATUS_LA57) != 0)
+ printf(", la57 active\n");
+ break;
+#endif
}
} else {
switch (mode) {
@@ -293,6 +335,18 @@ main(int argc, char *argv[])
arg = enable ? PROC_KPTI_CTL_ENABLE_ON_EXEC :
PROC_KPTI_CTL_DISABLE_ON_EXEC;
error = procctl(P_PID, pid, PROC_KPTI_CTL, &arg);
+ break;
+#endif
+#ifdef PROC_LA_CTL
+ case MODE_LA57:
+ arg = enable ? PROC_LA_CTL_LA57_ON_EXEC :
+ PROC_LA_CTL_DEFAULT_ON_EXEC;
+ error = procctl(P_PID, pid, PROC_LA_CTL, &arg);
+ break;
+ case MODE_LA48:
+ arg = enable ? PROC_LA_CTL_LA48_ON_EXEC :
+ PROC_LA_CTL_DEFAULT_ON_EXEC;
+ error = procctl(P_PID, pid, PROC_LA_CTL, &arg);
break;
#endif
default:
More information about the svn-src-all
mailing list