proccontrol(1): Add kpti control mode.
Requested by: jhb Reviewed by: jhb, markj (previous version) Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D19514
This commit is contained in:
parent
fd8d844f76
commit
bab3f1d04a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=345229
@ -43,6 +43,9 @@ enum {
|
|||||||
MODE_INVALID,
|
MODE_INVALID,
|
||||||
MODE_TRACE,
|
MODE_TRACE,
|
||||||
MODE_TRAPCAP,
|
MODE_TRAPCAP,
|
||||||
|
#ifdef PROC_KPTI_CTL
|
||||||
|
MODE_KPTI,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static pid_t
|
static pid_t
|
||||||
@ -59,11 +62,18 @@ str2pid(const char *str)
|
|||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PROC_KPTI_CTL
|
||||||
|
#define KPTI_USAGE "|kpti"
|
||||||
|
#else
|
||||||
|
#define KPTI_USAGE
|
||||||
|
#endif
|
||||||
|
|
||||||
static void __dead2
|
static void __dead2
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
fprintf(stderr, "Usage: proccontrol -m (aslr|trace|trapcap) [-q] "
|
fprintf(stderr, "Usage: proccontrol -m (aslr|trace|trapcap"
|
||||||
|
KPTI_USAGE") [-q] "
|
||||||
"[-s (enable|disable)] [-p pid | command]\n");
|
"[-s (enable|disable)] [-p pid | command]\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -88,6 +98,10 @@ main(int argc, char *argv[])
|
|||||||
mode = MODE_TRACE;
|
mode = MODE_TRACE;
|
||||||
else if (strcmp(optarg, "trapcap") == 0)
|
else if (strcmp(optarg, "trapcap") == 0)
|
||||||
mode = MODE_TRAPCAP;
|
mode = MODE_TRAPCAP;
|
||||||
|
#ifdef PROC_KPTI_CTL
|
||||||
|
else if (strcmp(optarg, "kpti") == 0)
|
||||||
|
mode = MODE_KPTI;
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
@ -133,6 +147,11 @@ main(int argc, char *argv[])
|
|||||||
case MODE_TRAPCAP:
|
case MODE_TRAPCAP:
|
||||||
error = procctl(P_PID, pid, PROC_TRAPCAP_STATUS, &arg);
|
error = procctl(P_PID, pid, PROC_TRAPCAP_STATUS, &arg);
|
||||||
break;
|
break;
|
||||||
|
#ifdef PROC_KPTI_CTL
|
||||||
|
case MODE_KPTI:
|
||||||
|
error = procctl(P_PID, pid, PROC_KPTI_STATUS, &arg);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
@ -175,6 +194,22 @@ main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#ifdef PROC_KPTI_CTL
|
||||||
|
case MODE_KPTI:
|
||||||
|
switch (arg & ~PROC_KPTI_STATUS_ACTIVE) {
|
||||||
|
case PROC_KPTI_CTL_ENABLE_ON_EXEC:
|
||||||
|
printf("enabled");
|
||||||
|
break;
|
||||||
|
case PROC_KPTI_CTL_DISABLE_ON_EXEC:
|
||||||
|
printf("disabled");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((arg & PROC_KPTI_STATUS_ACTIVE) != 0)
|
||||||
|
printf(", active\n");
|
||||||
|
else
|
||||||
|
printf(", not active\n");
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
@ -193,6 +228,13 @@ main(int argc, char *argv[])
|
|||||||
PROC_TRAPCAP_CTL_DISABLE;
|
PROC_TRAPCAP_CTL_DISABLE;
|
||||||
error = procctl(P_PID, pid, PROC_TRAPCAP_CTL, &arg);
|
error = procctl(P_PID, pid, PROC_TRAPCAP_CTL, &arg);
|
||||||
break;
|
break;
|
||||||
|
#ifdef PROC_KPTI_CTL
|
||||||
|
case MODE_KPTI:
|
||||||
|
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
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user