Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/include/asmacros.h
/* -*- mode: asm -*- */ | |||||
/*- | /*- | ||||
mmokhi: *style* ( 😅 ): Is it accidentally left here by your editor? | |||||
Not Done Inline ActionsThis is intended. Otherwise emacs gets too confused about native as macros. kib: This is intended. Otherwise emacs gets too confused about native as macros. | |||||
Not Done Inline ActionsAha, I see. mmokhi: Aha, I see.
Thanks for explanation 🙏 | |||||
* SPDX-License-Identifier: BSD-3-Clause | * SPDX-License-Identifier: BSD-3-Clause | ||||
* | * | ||||
* Copyright (c) 1993 The Regents of the University of California. | * Copyright (c) 1993 The Regents of the University of California. | ||||
* All rights reserved. | * All rights reserved. | ||||
* | * | ||||
* Copyright (c) 2018 The FreeBSD Foundation | |||||
* All rights reserved. | |||||
* | |||||
* Portions of this software were developed by | |||||
* Konstantin Belousov <kib@FreeBSD.org> under sponsorship from | |||||
* the FreeBSD Foundation. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
* modification, are permitted provided that the following conditions | * modification, are permitted provided that the following conditions | ||||
* are met: | * are met: | ||||
* 1. Redistributions of source code must retain the above copyright | * 1. Redistributions of source code must retain the above copyright | ||||
* notice, this list of conditions and the following disclaimer. | * notice, this list of conditions and the following disclaimer. | ||||
* 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright | ||||
* notice, this list of conditions and the following disclaimer in the | * notice, this list of conditions and the following disclaimer in the | ||||
* documentation and/or other materials provided with the distribution. | * documentation and/or other materials provided with the distribution. | ||||
▲ Show 20 Lines • Show All 126 Lines • ▼ Show 20 Lines | |||||
#define PUSH_FRAME_POINTER \ | #define PUSH_FRAME_POINTER \ | ||||
pushq %rbp ; \ | pushq %rbp ; \ | ||||
movq %rsp, %rbp ; | movq %rsp, %rbp ; | ||||
#define POP_FRAME_POINTER \ | #define POP_FRAME_POINTER \ | ||||
popq %rbp | popq %rbp | ||||
#ifdef LOCORE | #ifdef LOCORE | ||||
/* | /* | ||||
* Access per-CPU data. | |||||
*/ | |||||
#define PCPU(member) %gs:PC_ ## member | |||||
#define PCPU_ADDR(member, reg) \ | |||||
movq %gs:PC_PRVSPACE, reg ; \ | |||||
addq $PC_ ## member, reg | |||||
/* | |||||
* Convenience macro for declaring interrupt entry points. | * Convenience macro for declaring interrupt entry points. | ||||
*/ | */ | ||||
#define IDTVEC(name) ALIGN_TEXT; .globl __CONCAT(X,name); \ | #define IDTVEC(name) ALIGN_TEXT; .globl __CONCAT(X,name); \ | ||||
.type __CONCAT(X,name),@function; __CONCAT(X,name): | .type __CONCAT(X,name),@function; __CONCAT(X,name): | ||||
/* | .macro SAVE_SEGS | ||||
* Macros to create and destroy a trap frame. | movw %fs,TF_FS(%rsp) | ||||
*/ | movw %gs,TF_GS(%rsp) | ||||
#define PUSH_FRAME \ | movw %es,TF_ES(%rsp) | ||||
subq $TF_RIP,%rsp ; /* skip dummy tf_err and tf_trapno */ \ | movw %ds,TF_DS(%rsp) | ||||
testb $SEL_RPL_MASK,TF_CS(%rsp) ; /* come from kernel? */ \ | .endm | ||||
jz 1f ; /* Yes, dont swapgs again */ \ | |||||
swapgs ; \ | |||||
1: movq %rdi,TF_RDI(%rsp) ; \ | |||||
movq %rsi,TF_RSI(%rsp) ; \ | |||||
movq %rdx,TF_RDX(%rsp) ; \ | |||||
movq %rcx,TF_RCX(%rsp) ; \ | |||||
movq %r8,TF_R8(%rsp) ; \ | |||||
movq %r9,TF_R9(%rsp) ; \ | |||||
movq %rax,TF_RAX(%rsp) ; \ | |||||
movq %rbx,TF_RBX(%rsp) ; \ | |||||
movq %rbp,TF_RBP(%rsp) ; \ | |||||
movq %r10,TF_R10(%rsp) ; \ | |||||
movq %r11,TF_R11(%rsp) ; \ | |||||
movq %r12,TF_R12(%rsp) ; \ | |||||
movq %r13,TF_R13(%rsp) ; \ | |||||
movq %r14,TF_R14(%rsp) ; \ | |||||
movq %r15,TF_R15(%rsp) ; \ | |||||
movw %fs,TF_FS(%rsp) ; \ | |||||
movw %gs,TF_GS(%rsp) ; \ | |||||
movw %es,TF_ES(%rsp) ; \ | |||||
movw %ds,TF_DS(%rsp) ; \ | |||||
movl $TF_HASSEGS,TF_FLAGS(%rsp) ; \ | |||||
cld ; \ | |||||
testb $SEL_RPL_MASK,TF_CS(%rsp) ; /* come from kernel ? */ \ | |||||
jz 2f ; /* yes, leave PCB_FULL_IRET alone */ \ | |||||
movq PCPU(CURPCB),%r8 ; \ | |||||
andl $~PCB_FULL_IRET,PCB_FLAGS(%r8) ; \ | |||||
2: | |||||
#define POP_FRAME \ | .macro MOVE_STACKS qw | ||||
movq TF_RDI(%rsp),%rdi ; \ | offset=0 | ||||
movq TF_RSI(%rsp),%rsi ; \ | .rept \qw | ||||
movq TF_RDX(%rsp),%rdx ; \ | movq offset(%rsp),%rdx | ||||
movq TF_RCX(%rsp),%rcx ; \ | movq %rdx,offset(%rax) | ||||
movq TF_R8(%rsp),%r8 ; \ | offset=offset+8 | ||||
movq TF_R9(%rsp),%r9 ; \ | .endr | ||||
movq TF_RAX(%rsp),%rax ; \ | .endm | ||||
movq TF_RBX(%rsp),%rbx ; \ | |||||
movq TF_RBP(%rsp),%rbp ; \ | |||||
movq TF_R10(%rsp),%r10 ; \ | |||||
movq TF_R11(%rsp),%r11 ; \ | |||||
movq TF_R12(%rsp),%r12 ; \ | |||||
movq TF_R13(%rsp),%r13 ; \ | |||||
movq TF_R14(%rsp),%r14 ; \ | |||||
movq TF_R15(%rsp),%r15 ; \ | |||||
testb $SEL_RPL_MASK,TF_CS(%rsp) ; /* come from kernel? */ \ | |||||
jz 1f ; /* keep kernel GS.base */ \ | |||||
cli ; \ | |||||
swapgs ; \ | |||||
1: addq $TF_RIP,%rsp /* skip over tf_err, tf_trapno */ | |||||
/* | .macro PTI_UENTRY has_err | ||||
* Access per-CPU data. | swapgs | ||||
*/ | pushq %rax | ||||
#define PCPU(member) %gs:PC_ ## member | pushq %rdx | ||||
#define PCPU_ADDR(member, reg) \ | movq PCPU(KCR3),%rax | ||||
movq %gs:PC_PRVSPACE, reg ; \ | movq %rax,%cr3 | ||||
addq $PC_ ## member, reg | movq PCPU(RSP0),%rax | ||||
subq $PTI_SIZE,%rax | |||||
MOVE_STACKS (PTI_SIZE / 8) - 1 + \has_err | |||||
movq %rax,%rsp | |||||
popq %rdx | |||||
popq %rax | |||||
.endm | |||||
.macro PTI_ENTRY name, cont, has_err=0 | |||||
ALIGN_TEXT | |||||
.globl X\name\()_pti | |||||
.type X\name\()_pti,@function | |||||
X\name\()_pti: | |||||
/* %rax, %rdx and possibly err not yet pushed */ | |||||
testb $SEL_RPL_MASK,PTI_CS-(2+1-\has_err)*8(%rsp) | |||||
jz \cont | |||||
PTI_UENTRY \has_err | |||||
swapgs | |||||
jmp \cont | |||||
.endm | |||||
.macro PTI_INTRENTRY vec_name | |||||
SUPERALIGN_TEXT | |||||
.globl X\vec_name\()_pti | |||||
.type X\vec_name\()_pti,@function | |||||
X\vec_name\()_pti: | |||||
testb $SEL_RPL_MASK,PTI_CS-3*8(%rsp) /* err, %rax, %rdx not pushed */ | |||||
jz \vec_name\()_u | |||||
PTI_UENTRY has_err=0 | |||||
jmp \vec_name\()_u | |||||
.endm | |||||
.macro INTR_PUSH_FRAME vec_name | |||||
SUPERALIGN_TEXT | |||||
.globl X\vec_name | |||||
.type X\vec_name,@function | |||||
X\vec_name: | |||||
testb $SEL_RPL_MASK,PTI_CS-3*8(%rsp) /* come from kernel? */ | |||||
jz \vec_name\()_u /* Yes, dont swapgs again */ | |||||
swapgs | |||||
\vec_name\()_u: | |||||
subq $TF_RIP,%rsp /* skip dummy tf_err and tf_trapno */ | |||||
movq %rdi,TF_RDI(%rsp) | |||||
movq %rsi,TF_RSI(%rsp) | |||||
movq %rdx,TF_RDX(%rsp) | |||||
movq %rcx,TF_RCX(%rsp) | |||||
movq %r8,TF_R8(%rsp) | |||||
movq %r9,TF_R9(%rsp) | |||||
movq %rax,TF_RAX(%rsp) | |||||
movq %rbx,TF_RBX(%rsp) | |||||
movq %rbp,TF_RBP(%rsp) | |||||
movq %r10,TF_R10(%rsp) | |||||
movq %r11,TF_R11(%rsp) | |||||
movq %r12,TF_R12(%rsp) | |||||
movq %r13,TF_R13(%rsp) | |||||
movq %r14,TF_R14(%rsp) | |||||
movq %r15,TF_R15(%rsp) | |||||
SAVE_SEGS | |||||
movl $TF_HASSEGS,TF_FLAGS(%rsp) | |||||
cld | |||||
testb $SEL_RPL_MASK,TF_CS(%rsp) /* come from kernel ? */ | |||||
jz 1f /* yes, leave PCB_FULL_IRET alone */ | |||||
movq PCPU(CURPCB),%r8 | |||||
andl $~PCB_FULL_IRET,PCB_FLAGS(%r8) | |||||
1: | |||||
.endm | |||||
.macro INTR_HANDLER vec_name | |||||
.text | |||||
PTI_INTRENTRY \vec_name | |||||
INTR_PUSH_FRAME \vec_name | |||||
.endm | |||||
.macro RESTORE_REGS | |||||
movq TF_RDI(%rsp),%rdi | |||||
movq TF_RSI(%rsp),%rsi | |||||
movq TF_RDX(%rsp),%rdx | |||||
movq TF_RCX(%rsp),%rcx | |||||
movq TF_R8(%rsp),%r8 | |||||
movq TF_R9(%rsp),%r9 | |||||
movq TF_RAX(%rsp),%rax | |||||
movq TF_RBX(%rsp),%rbx | |||||
movq TF_RBP(%rsp),%rbp | |||||
movq TF_R10(%rsp),%r10 | |||||
movq TF_R11(%rsp),%r11 | |||||
movq TF_R12(%rsp),%r12 | |||||
movq TF_R13(%rsp),%r13 | |||||
movq TF_R14(%rsp),%r14 | |||||
movq TF_R15(%rsp),%r15 | |||||
.endm | |||||
#endif /* LOCORE */ | #endif /* LOCORE */ | ||||
#ifdef __STDC__ | #ifdef __STDC__ | ||||
#define ELFNOTE(name, type, desctype, descdata...) \ | #define ELFNOTE(name, type, desctype, descdata...) \ | ||||
.pushsection .note.name ; \ | .pushsection .note.name ; \ | ||||
.align 4 ; \ | .align 4 ; \ | ||||
.long 2f - 1f /* namesz */ ; \ | .long 2f - 1f /* namesz */ ; \ | ||||
Show All 22 Lines |
*style* ( 😅 ): Is it accidentally left here by your editor?