#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void
handler(int sig, siginfo_t *sip, void *ctx)
{
printf("signo %d, code %d, errno %d\n", sip->si_signo, sip->si_code,
sip->si_errno);
if (sig != SIGILL)
errx(1, "expected SIGILL: %d", sig);
if (sip->si_code != ILL_PRVOPC)
errx(1, "expected ILL_PRVOPC: %d", sip->si_code);
exit(0);
}
__dead static void
usage(void)
{
fprintf(stderr, "usage: %s vmmcall | vmgexit\n",
getprogname());
exit(2);
}
int
main(int argc, char **argv)
{
struct sigaction sa;
int n;
if (argc != 2)
usage();
if (strcmp(argv[1], "vmmcall") == 0)
n = 0;
else if (strcmp(argv[1], "vmgexit") == 0)
n = 1;
else
usage();
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
if (sigaction(SIGILL, &sa, NULL) == -1)
err(2, "sigaction");
switch (n) {
case 0:
asm volatile("vmmcall");
break;
case 1:
asm volatile("rep; vmmcall");
break;
}
errx(1, "expected signal");
return (0);
}