mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-09 08:56:15 +00:00
60 lines
1.4 KiB
C
60 lines
1.4 KiB
C
/* Test that all instructions that make syscalls are handled correctly.
|
|
Note that it isn't possible to run this program natively. */
|
|
|
|
#include <stdio.h>
|
|
#include <sys/syscall.h>
|
|
#include <sys/trap.h>
|
|
|
|
#define SYSCALL(instr, scnum, out) \
|
|
do { \
|
|
__asm__ __volatile__( \
|
|
"movl %1,%%eax\n" \
|
|
"leal 0f,%%edx\n" /* Set return address for SYSENTER. */ \
|
|
instr "\n" \
|
|
"0:\n" \
|
|
"movl %%eax,%0\n" \
|
|
: "=m" (out) \
|
|
: "i" (scnum) \
|
|
: "eax", "edx", "cc", "memory"); \
|
|
} while (0)
|
|
|
|
static void check_pid(int pid, int pid2, const char *instr)
|
|
{
|
|
if (pid == pid2)
|
|
return;
|
|
|
|
fprintf(stderr, "Pid values differ, instruction: %s\n", instr);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
int pid, pid2, dummy;
|
|
|
|
/* Normal Solaris/x86 syscall instructions. */
|
|
SYSCALL("int $0x91", SYS_getpid, pid);
|
|
|
|
/* AMD's syscall instruction. */
|
|
SYSCALL("syscall", SYS_getpid, pid2);
|
|
check_pid(pid, pid2, "syscall");
|
|
|
|
/* Intel's sysenter instruction. */
|
|
SYSCALL("sysenter", SYS_getpid, pid2);
|
|
check_pid(pid, pid2, "sysenter");
|
|
|
|
/* Linux syscall instructions that are handled as "int $0x91". */
|
|
SYSCALL("int $0x80", SYS_getpid, pid2);
|
|
check_pid(pid, pid2, "int $0x80");
|
|
|
|
SYSCALL("int $0x81", SYS_getpid, pid2);
|
|
check_pid(pid, pid2, "int $0x81");
|
|
|
|
SYSCALL("int $0x82", SYS_getpid, pid2);
|
|
check_pid(pid, pid2, "int $0x82");
|
|
|
|
/* Fasttraps. */
|
|
SYSCALL("int $0xd2", T_GETHRTIME, dummy);
|
|
|
|
return 0;
|
|
}
|
|
|