aboutsummaryrefslogtreecommitdiff
path: root/user/include/weenix/trap.h
blob: fade1eb11ca6a57b72f1c5cee5d33b3e3c930f91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#pragma once

#include "errno.h"
#include "stddef.h"
#include "sys/types.h"
#include "weenix/syscall.h"

#define TRAP_INTR_STRING QUOTE(INTR_SYSCALL)

/* ssize_t will be 32 bits or 64 bits wide as appropriate.
   args are passed via %(r/e)ax and %(r/e)dx, so they need
   to be the size of a register.  */

static inline ssize_t trap(ssize_t num, ssize_t arg)
{
    ssize_t ret;
    __asm__ volatile("int $" TRAP_INTR_STRING
                     : "=a"(ret)
                     : "a"(num), "d"(arg));

    /* Copy in errno */
    __asm__ volatile("int $" TRAP_INTR_STRING
                     : "=a"(errno)
                     : "a"(SYS_errno));
    return ret;
}