forked from Imagelibrary/seL4
x64: fix sysenter syscalls
The MCS-related macros were causing the build to fail when configured to use the sysenter instruction. Additionally, some message registers weren't explicitly being passed to the assembly block for seL4_NBSendRecv in this configuration. Signed-off-by: Jimmy Brush <code@jimmah.com>
This commit is contained in:
@@ -11,11 +11,11 @@
|
|||||||
#include <sel4/types.h>
|
#include <sel4/types.h>
|
||||||
|
|
||||||
#ifdef CONFIG_KERNEL_MCS
|
#ifdef CONFIG_KERNEL_MCS
|
||||||
#define MCS_PARAM_DECL(r) register seL4_Word reply_reg asm(r) = reply;
|
#define MCS_REPLY_DECL register seL4_Word reply_reg asm("r12") = reply;
|
||||||
#define MCS_PARAM , "r"(reply_reg)
|
#define MCS_REPLY ,"r"(reply_reg)
|
||||||
#else
|
#else
|
||||||
#define MCS_PARAM_DECL(r)
|
#define MCS_REPLY_DECL
|
||||||
#define MCS_PARAM
|
#define MCS_REPLY
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ static inline void x64_sys_recv(seL4_Word sys, seL4_Word src, seL4_Word *out_bad
|
|||||||
register seL4_Word mr1 asm("r8");
|
register seL4_Word mr1 asm("r8");
|
||||||
register seL4_Word mr2 asm("r9");
|
register seL4_Word mr2 asm("r9");
|
||||||
register seL4_Word mr3 asm("r15");
|
register seL4_Word mr3 asm("r15");
|
||||||
MCS_PARAM_DECL("r12");
|
MCS_REPLY_DECL;
|
||||||
|
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movq %%rsp, %%rcx \n"
|
"movq %%rsp, %%rcx \n"
|
||||||
@@ -106,8 +106,8 @@ static inline void x64_sys_recv(seL4_Word sys, seL4_Word src, seL4_Word *out_bad
|
|||||||
"=r"(mr2),
|
"=r"(mr2),
|
||||||
"=r"(mr3)
|
"=r"(mr3)
|
||||||
: "a"(sys),
|
: "a"(sys),
|
||||||
"D"(src),
|
"D"(src)
|
||||||
MCS_PARAM
|
MCS_REPLY
|
||||||
: "%rcx", "%rdx", "memory"
|
: "%rcx", "%rdx", "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@ static inline void x64_sys_send_recv(seL4_Word sys, seL4_Word dest, seL4_Word *o
|
|||||||
register seL4_Word mr1 asm("r8") = *in_out_mr1;
|
register seL4_Word mr1 asm("r8") = *in_out_mr1;
|
||||||
register seL4_Word mr2 asm("r9") = *in_out_mr2;
|
register seL4_Word mr2 asm("r9") = *in_out_mr2;
|
||||||
register seL4_Word mr3 asm("r15") = *in_out_mr3;
|
register seL4_Word mr3 asm("r15") = *in_out_mr3;
|
||||||
MCS_PARAM_DECL("r12");
|
MCS_REPLY_DECL;
|
||||||
|
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movq %%rsp, %%rcx \n"
|
"movq %%rsp, %%rcx \n"
|
||||||
@@ -144,8 +144,8 @@ static inline void x64_sys_send_recv(seL4_Word sys, seL4_Word dest, seL4_Word *o
|
|||||||
"r"(mr0),
|
"r"(mr0),
|
||||||
"r"(mr1),
|
"r"(mr1),
|
||||||
"r"(mr2),
|
"r"(mr2),
|
||||||
"r"(mr3),
|
"r"(mr3)
|
||||||
MCS_PARAM
|
MCS_REPLY
|
||||||
: "%rcx", "%rdx", "memory"
|
: "%rcx", "%rdx", "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -175,12 +175,16 @@ static inline void x64_sys_nbsend_recv(seL4_Word sys, seL4_Word dest, seL4_Word
|
|||||||
: "=S"(*out_info),
|
: "=S"(*out_info),
|
||||||
"=r"(mr0),
|
"=r"(mr0),
|
||||||
"=r"(mr1),
|
"=r"(mr1),
|
||||||
|
"=r"(mr2),
|
||||||
|
"=r"(mr3),
|
||||||
"=D"(*out_dest)
|
"=D"(*out_dest)
|
||||||
: "a"(sys),
|
: "a"(sys),
|
||||||
"D"(src),
|
"D"(src),
|
||||||
"S"(info),
|
"S"(info),
|
||||||
"r"(mr0),
|
"r"(mr0),
|
||||||
"r"(mr1),
|
"r"(mr1),
|
||||||
|
"r"(mr2),
|
||||||
|
"r"(mr3),
|
||||||
"r"(reply_reg),
|
"r"(reply_reg),
|
||||||
"r"(dest_reg)
|
"r"(dest_reg)
|
||||||
: "%rcx", "%rdx", "memory"
|
: "%rcx", "%rdx", "memory"
|
||||||
|
|||||||
Reference in New Issue
Block a user