staticvoid expect_gp_sti(bool irqs_off)
{ int ret = try_sti(irqs_off);
switch (ret) { case RET_FAULTED:
printf("[OK]\tSTI faulted\n"); break; case RET_EMUL:
printf("[OK]\tSTI NOPped\n"); break; default:
printf("[FAIL]\tSTI worked\n");
nerrs++;
}
}
/* * Returns whether it managed to disable interrupts.
*/ staticbool test_cli(void)
{ int ret = try_cli();
switch (ret) { case RET_FAULTED:
printf("[OK]\tCLI faulted\n"); break; case RET_EMUL:
printf("[OK]\tCLI NOPped\n"); break; default:
printf("[FAIL]\tCLI worked\n");
nerrs++; returntrue;
}
returnfalse;
}
int main(void)
{
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(0, &cpuset); if (sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0)
err(1, "sched_setaffinity to CPU 0");
/* Probe for iopl support. Note that iopl(0) works even as nonroot. */ switch(iopl(3)) { case 0: break; case -ENOSYS:
printf("[OK]\tiopl() nor supported\n"); return 0; default:
printf("[OK]\tiopl(3) failed (%d) -- try running as root\n",
errno); return 0;
}
/* Make sure that CLI/STI are blocked even with IOPL level 3 */
expect_gp_sti(test_cli());
expect_ok_outb(0x80);
/* Establish an I/O bitmap to test the restore */ if (ioperm(0x80, 1, 1) != 0)
err(1, "ioperm(0x80, 1, 1) failed\n");
/* Restore our original state prior to starting the fork test. */ if (iopl(0) != 0)
err(1, "iopl(0)");
/* * Verify that IOPL emulation is disabled and the I/O bitmap still * works.
*/
expect_ok_outb(0x80);
expect_gp_outb(0xed); /* Drop the I/O bitmap */ if (ioperm(0x80, 1, 0) != 0)
err(1, "ioperm(0x80, 1, 0) failed\n");
pid_t child = fork(); if (child == -1)
err(1, "fork");
if (child == 0) {
printf("\tchild: set IOPL to 3\n"); if (iopl(3) != 0)
err(1, "iopl");
printf("[RUN]\tchild: write to 0x80\n"); asmvolatile ("outb %%al, $0x80" : : "a" (0));
printf("[RUN]\tiopl(3) unprivileged but with IOPL==3\n"); if (iopl(3) != 0) {
printf("[FAIL]\tiopl(3) should work if iopl is already 3 even if unprivileged\n");
nerrs++;
}
printf("[RUN]\tiopl(0) unprivileged\n"); if (iopl(0) != 0) {
printf("[FAIL]\tiopl(0) should work if iopl is already 3 even if unprivileged\n");
nerrs++;
}
printf("[RUN]\tiopl(3) unprivileged\n"); if (iopl(3) == 0) {
printf("[FAIL]\tiopl(3) should fail if when unprivileged if iopl==0\n");
nerrs++;
} else {
printf("[OK]\tFailed as expected\n");
}
done: return nerrs ? 1 : 0;
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.