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:
Jimmy Brush
2020-03-02 16:00:56 -05:00
committed by Kent McLeod
parent d18f752739
commit b316072daa

View File

@@ -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"