Annotation of src/sys/arch/amd64/include/frameasm.h, Revision 1.35
1.35 ! maxv 1: /* $NetBSD: frameasm.h,v 1.34 2018/01/27 18:27:08 maxv Exp $ */
1.1 fvdl 2:
3: #ifndef _AMD64_MACHINE_FRAMEASM_H
4: #define _AMD64_MACHINE_FRAMEASM_H
1.13 ad 5:
6: #ifdef _KERNEL_OPT
1.8 bouyer 7: #include "opt_xen.h"
1.27 maxv 8: #include "opt_svs.h"
1.13 ad 9: #endif
1.1 fvdl 10:
11: /*
12: * Macros to define pushing/popping frames for interrupts, traps
13: * and system calls. Currently all the same; will diverge later.
14: */
15:
1.8 bouyer 16: #ifdef XEN
17: #define HYPERVISOR_iret hypercall_page + (__HYPERVISOR_iret * 32)
18: /* Xen do not need swapgs, done by hypervisor */
19: #define swapgs
20: #define iretq pushq $0 ; jmp HYPERVISOR_iret
1.17 dsl 21: #define XEN_ONLY2(x,y) x,y
22: #define NOT_XEN(x)
23:
24: #define CLI(temp_reg) \
25: movq CPUVAR(VCPU),%r ## temp_reg ; \
26: movb $1,EVTCHN_UPCALL_MASK(%r ## temp_reg);
27:
28: #define STI(temp_reg) \
29: movq CPUVAR(VCPU),%r ## temp_reg ; \
30: movb $0,EVTCHN_UPCALL_MASK(%r ## temp_reg);
31:
32: #else /* XEN */
33: #define XEN_ONLY2(x,y)
34: #define NOT_XEN(x) x
35: #define CLI(temp_reg) cli
36: #define STI(temp_reg) sti
37: #endif /* XEN */
1.8 bouyer 38:
1.26 maxv 39: #define HP_NAME_CLAC 1
40: #define HP_NAME_STAC 2
41: #define HP_NAME_NOLOCK 3
42: #define HP_NAME_RETFENCE 4
1.35 ! maxv 43: #define HP_NAME_SVS_ENTER 5
! 44: #define HP_NAME_SVS_LEAVE 6
! 45: #define HP_NAME_SVS_ENTER_ALT 7
! 46: #define HP_NAME_SVS_LEAVE_ALT 8
1.24 maxv 47:
48: #define HOTPATCH(name, size) \
49: 123: ; \
1.30 maxv 50: .pushsection .rodata.hotpatch, "a" ; \
1.24 maxv 51: .byte name ; \
52: .byte size ; \
53: .quad 123b ; \
1.30 maxv 54: .popsection
1.24 maxv 55:
56: #define SMAP_ENABLE \
57: HOTPATCH(HP_NAME_CLAC, 3) ; \
58: .byte 0x0F, 0x1F, 0x00 ; \
59:
60: #define SMAP_DISABLE \
61: HOTPATCH(HP_NAME_STAC, 3) ; \
62: .byte 0x0F, 0x1F, 0x00 ; \
63:
1.20 dsl 64: #define SWAPGS NOT_XEN(swapgs)
65:
1.1 fvdl 66: /*
67: * These are used on interrupt or trap entry or exit.
68: */
69: #define INTR_SAVE_GPRS \
70: movq %rdi,TF_RDI(%rsp) ; \
71: movq %rsi,TF_RSI(%rsp) ; \
1.10 dsl 72: movq %rdx,TF_RDX(%rsp) ; \
73: movq %rcx,TF_RCX(%rsp) ; \
74: movq %r8,TF_R8(%rsp) ; \
75: movq %r9,TF_R9(%rsp) ; \
76: movq %r10,TF_R10(%rsp) ; \
77: movq %r11,TF_R11(%rsp) ; \
78: movq %r12,TF_R12(%rsp) ; \
79: movq %r13,TF_R13(%rsp) ; \
80: movq %r14,TF_R14(%rsp) ; \
81: movq %r15,TF_R15(%rsp) ; \
1.1 fvdl 82: movq %rbp,TF_RBP(%rsp) ; \
83: movq %rbx,TF_RBX(%rsp) ; \
1.23 maxv 84: movq %rax,TF_RAX(%rsp)
1.1 fvdl 85:
86: #define INTR_RESTORE_GPRS \
87: movq TF_RDI(%rsp),%rdi ; \
88: movq TF_RSI(%rsp),%rsi ; \
1.10 dsl 89: movq TF_RDX(%rsp),%rdx ; \
90: movq TF_RCX(%rsp),%rcx ; \
91: movq TF_R8(%rsp),%r8 ; \
92: movq TF_R9(%rsp),%r9 ; \
93: movq TF_R10(%rsp),%r10 ; \
94: movq TF_R11(%rsp),%r11 ; \
95: movq TF_R12(%rsp),%r12 ; \
96: movq TF_R13(%rsp),%r13 ; \
97: movq TF_R14(%rsp),%r14 ; \
98: movq TF_R15(%rsp),%r15 ; \
1.1 fvdl 99: movq TF_RBP(%rsp),%rbp ; \
100: movq TF_RBX(%rsp),%rbx ; \
1.10 dsl 101: movq TF_RAX(%rsp),%rax
1.1 fvdl 102:
1.31 maxv 103: #define TEXT_USER_BEGIN .pushsection .text.user, "ax"
104: #define TEXT_USER_END .popsection
105:
1.27 maxv 106: #ifdef SVS
1.29 maxv 107:
108: /* XXX: put this somewhere else */
109: #define SVS_UTLS 0xffffc00000000000 /* PMAP_PCPU_BASE */
110: #define UTLS_KPDIRPA 0
111: #define UTLS_SCRATCH 8
112: #define UTLS_RSP0 16
113:
1.35 ! maxv 114: #define SVS_ENTER_BYTES 22
1.27 maxv 115: #define SVS_ENTER \
1.35 ! maxv 116: HOTPATCH(HP_NAME_SVS_ENTER, SVS_ENTER_BYTES) ; \
! 117: .byte 0xEB, (SVS_ENTER_BYTES-2) /* jmp */ ; \
! 118: .fill (SVS_ENTER_BYTES-2),1,0xCC
1.29 maxv 119:
1.35 ! maxv 120: #define SVS_LEAVE_BYTES 31
1.27 maxv 121: #define SVS_LEAVE \
1.35 ! maxv 122: HOTPATCH(HP_NAME_SVS_LEAVE, SVS_LEAVE_BYTES) ; \
! 123: .byte 0xEB, (SVS_LEAVE_BYTES-2) /* jmp */ ; \
! 124: .fill (SVS_LEAVE_BYTES-2),1,0xCC
1.29 maxv 125:
1.35 ! maxv 126: #define SVS_ENTER_ALT_BYTES 23
1.29 maxv 127: #define SVS_ENTER_ALTSTACK \
1.35 ! maxv 128: HOTPATCH(HP_NAME_SVS_ENTER_ALT, SVS_ENTER_ALT_BYTES) ; \
! 129: .byte 0xEB, (SVS_ENTER_ALT_BYTES-2) /* jmp */ ; \
! 130: .fill (SVS_ENTER_ALT_BYTES-2),1,0xCC
1.29 maxv 131:
1.35 ! maxv 132: #define SVS_LEAVE_ALT_BYTES 22
1.29 maxv 133: #define SVS_LEAVE_ALTSTACK \
1.35 ! maxv 134: HOTPATCH(HP_NAME_SVS_LEAVE_ALT, SVS_LEAVE_ALT_BYTES) ; \
! 135: .byte 0xEB, (SVS_LEAVE_ALT_BYTES-2) /* jmp */ ; \
! 136: .fill (SVS_LEAVE_ALT_BYTES-2),1,0xCC
! 137:
1.27 maxv 138: #else
139: #define SVS_ENTER /* nothing */
140: #define SVS_LEAVE /* nothing */
1.29 maxv 141: #define SVS_ENTER_ALTSTACK /* nothing */
142: #define SVS_LEAVE_ALTSTACK /* nothing */
1.27 maxv 143: #endif
144:
1.19 dsl 145: #define INTRENTRY_L(kernel_trap, usertrap) \
1.10 dsl 146: subq $TF_REGSIZE,%rsp ; \
1.17 dsl 147: INTR_SAVE_GPRS ; \
1.23 maxv 148: cld ; \
1.24 maxv 149: SMAP_ENABLE ; \
1.17 dsl 150: testb $SEL_UPL,TF_CS(%rsp) ; \
151: je kernel_trap ; \
1.19 dsl 152: usertrap ; \
1.20 dsl 153: SWAPGS ; \
1.27 maxv 154: SVS_ENTER ; \
1.10 dsl 155: movw %gs,TF_GS(%rsp) ; \
156: movw %fs,TF_FS(%rsp) ; \
157: movw %es,TF_ES(%rsp) ; \
1.17 dsl 158: movw %ds,TF_DS(%rsp)
159:
160: #define INTRENTRY \
1.19 dsl 161: INTRENTRY_L(98f,) ; \
1.17 dsl 162: 98:
1.1 fvdl 163:
164: #define INTRFASTEXIT \
1.21 maxv 165: jmp intrfastexit
1.1 fvdl 166:
167: #define INTR_RECURSE_HWFRAME \
168: movq %rsp,%r10 ; \
169: movl %ss,%r11d ; \
170: pushq %r11 ; \
171: pushq %r10 ; \
172: pushfq ; \
1.34 maxv 173: pushq $GSEL(GCODE_SEL,SEL_KPL); \
1.17 dsl 174: /* XEN: We must fixup CS, as even kernel mode runs at CPL 3 */ \
1.18 dsl 175: XEN_ONLY2(andb $0xfc,(%rsp);) \
1.1 fvdl 176: pushq %r13 ;
177:
1.33 maxv 178: #define INTR_RECURSE_ENTRY \
179: subq $TF_REGSIZE,%rsp ; \
180: INTR_SAVE_GPRS ; \
181: cld
182:
1.6 yamt 183: #define CHECK_DEFERRED_SWITCH \
1.14 chs 184: cmpl $0, CPUVAR(WANT_PMAPLOAD)
1.1 fvdl 185:
1.11 yamt 186: #define CHECK_ASTPENDING(reg) cmpl $0, L_MD_ASTPENDING(reg)
1.2 ad 187: #define CLEAR_ASTPENDING(reg) movl $0, L_MD_ASTPENDING(reg)
1.1 fvdl 188:
189: #endif /* _AMD64_MACHINE_FRAMEASM_H */
CVSweb <webmaster@jp.NetBSD.org>