]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/amd64/efirt_support.S
Merge bmake-20200606
[FreeBSD/FreeBSD.git] / sys / amd64 / amd64 / efirt_support.S
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2018 The FreeBSD Foundation
5  * All rights reserved.
6  *
7  * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
8  * under sponsorship from the FreeBSD Foundation.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  * $FreeBSD$
32  */
33
34 #include <machine/asmacros.h>
35
36 #include "assym.inc"
37
38         .text
39 ENTRY(efi_rt_arch_call)
40         pushq   %rbp
41         movq    %rsp, %rbp
42
43         movq    %rbx, EC_RBX(%rdi)
44         movq    %rsp, EC_RSP(%rdi)
45         movq    %rbp, EC_RBP(%rdi)
46         movq    %r12, EC_R12(%rdi)
47         movq    %r13, EC_R13(%rdi)
48         movq    %r14, EC_R14(%rdi)
49         movq    %r15, EC_R15(%rdi)
50         pushfq
51         popq    %rax
52         movq    %rax, EC_RFLAGS(%rdi)
53         movq    PCPU(CURTHREAD), %rax
54         movq    %rdi, TD_MD+MD_EFIRT_TMP(%rax)
55         movq    PCPU(CURPCB), %rsi
56
57         movl    EC_ARGCNT(%rdi), %ecx
58         movl    %ecx, %ebx
59         movl    $4, %eax
60         cmpl    %eax, %ecx
61         cmovbl  %eax, %ecx
62         shll    $3, %ecx
63         subq    %rcx, %rsp
64
65         cmpl    $0, %ebx
66         jz      1f
67         movq    EC_ARG1(%rdi), %rcx
68         decl    %ebx
69         jz      1f
70         movq    EC_ARG2(%rdi), %rdx
71         decl    %ebx
72         jz      1f
73         movq    EC_ARG3(%rdi), %r8
74         decl    %ebx
75         jz      1f
76         movq    EC_ARG4(%rdi), %r9
77         decl    %ebx
78         jz      1f
79         movq    EC_ARG5(%rdi), %rax
80         movq    %rax, 4*8(%rsp)
81         decl    %ebx
82         jz      1f
83         movq    $efi_rt_panic_str, %rdi
84         call    panic
85 1:      movq    EC_FPTR(%rdi), %rax
86         movq    $efi_rt_fault, PCB_ONFAULT(%rsi)
87         callq   *%rax
88
89         movq    PCPU(CURTHREAD), %rbx
90         movq    TD_MD+MD_EFIRT_TMP(%rbx), %rdi
91         movq    %rax, EC_EFI_STATUS(%rdi)
92         movq    PCPU(CURPCB), %rsi
93         xorl    %eax, %eax
94         movq    %rax, PCB_ONFAULT(%rsi)
95
96 efi_rt_arch_call_tail:
97         movq    EC_R15(%rdi), %r15
98         movq    EC_R14(%rdi), %r14
99         movq    EC_R13(%rdi), %r13
100         movq    EC_R12(%rdi), %r12
101         movq    EC_RBP(%rdi), %rbp
102         movq    EC_RSP(%rdi), %rsp
103         movq    EC_RBX(%rdi), %rbx
104         pushq   EC_RFLAGS(%rdi)
105         popfq
106
107         popq    %rbp
108         ret
109 END(efi_rt_arch_call)
110
111 ENTRY(efi_rt_fault)
112         xorl    %eax, %eax
113         movq    PCPU(CURPCB), %rsi
114         movq    %rax, PCB_ONFAULT(%rsi)
115         movl    $EFAULT, %eax
116         movq    PCPU(CURTHREAD), %rbx
117         movq    TD_MD+MD_EFIRT_TMP(%rbx), %rdi
118         jmp     efi_rt_arch_call_tail
119 END(efi_rt_fault)
120
121 efi_rt_panic_str:       .asciz  "efi_rt_arch_call: too many args"