diff options
author | Sebastian Schmelzer | 2010-10-25 16:53:54 +0200 |
---|---|---|
committer | Sebastian Schmelzer | 2010-10-25 16:53:54 +0200 |
commit | 3050a9253437f4a4b5ad4bf3b3efdc3c660a5137 (patch) | |
tree | 91ac22153e416aac7ca20916b314b5e2ffa871b1 /contrib/syslinux-4.02/com32/lib/sys/farcall.c | |
download | preboot-3050a9253437f4a4b5ad4bf3b3efdc3c660a5137.tar.gz preboot-3050a9253437f4a4b5ad4bf3b3efdc3c660a5137.tar.xz preboot-3050a9253437f4a4b5ad4bf3b3efdc3c660a5137.zip |
Diffstat (limited to 'contrib/syslinux-4.02/com32/lib/sys/farcall.c')
-rw-r--r-- | contrib/syslinux-4.02/com32/lib/sys/farcall.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/com32/lib/sys/farcall.c b/contrib/syslinux-4.02/com32/lib/sys/farcall.c new file mode 100644 index 0000000..988ee6d --- /dev/null +++ b/contrib/syslinux-4.02/com32/lib/sys/farcall.c @@ -0,0 +1,24 @@ +/* + * farcall.c + */ + +#include <com32.h> + +static inline uint32_t eflags(void) +{ + uint32_t v; + + asm volatile("pushfl ; popl %0" : "=rm" (v)); + return v; +} + +void __farcall(uint16_t cs, uint16_t ip, + const com32sys_t * ireg, com32sys_t * oreg) +{ + com32sys_t xreg = *ireg; + + /* Enable interrupts if and only if they are enabled in the caller */ + xreg.eflags.l = (xreg.eflags.l & ~EFLAGS_IF) | (eflags() & EFLAGS_IF); + + __com32.cs_farcall((cs << 16) + ip, &xreg, oreg); +} |