]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/amd64/efirt_support.S
Update driver version to 07.709.04.00-fbsd
[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         movq    PCPU(CURTHREAD), %rax
51         movq    %rdi, TD_MD+MD_EFIRT_TMP(%rax)
52         movq    PCPU(CURPCB), %rsi
53
54         movl    EC_ARGCNT(%rdi), %ecx
55         movl    %ecx, %ebx
56         movl    $4, %eax
57         cmpl    %eax, %ecx
58         cmovbl  %eax, %ecx
59         shll    $3, %ecx
60         subq    %rcx, %rsp
61
62         cmpl    $0, %ebx
63         jz      1f
64         movq    EC_ARG1(%rdi), %rcx
65         decl    %ebx
66         jz      1f
67         movq    EC_ARG2(%rdi), %rdx
68         decl    %ebx
69         jz      1f
70         movq    EC_ARG3(%rdi), %r8
71         decl    %ebx
72         jz      1f
73         movq    EC_ARG4(%rdi), %r9
74         decl    %ebx
75         jz      1f
76         movq    EC_ARG5(%rdi), %rax
77         movq    %rax, 4*8(%rsp)
78         decl    %ebx
79         jz      1f
80         movq    $efi_rt_panic_str, %rdi
81         call    panic
82 1:      movq    EC_FPTR(%rdi), %rax
83         movq    $efi_rt_fault, PCB_ONFAULT(%rsi)
84         callq   *%rax
85
86         movq    PCPU(CURTHREAD), %rbx
87         movq    TD_MD+MD_EFIRT_TMP(%rbx), %rdi
88         movq    %rax, EC_EFI_STATUS(%rdi)
89         movq    PCPU(CURPCB), %rsi
90         xorl    %eax, %eax
91         movq    %rax, PCB_ONFAULT(%rsi)
92
93 efi_rt_arch_call_tail:
94         movq    EC_R15(%rdi), %r15
95         movq    EC_R14(%rdi), %r14
96         movq    EC_R13(%rdi), %r13
97         movq    EC_R12(%rdi), %r12
98         movq    EC_RBP(%rdi), %rbp
99         movq    EC_RSP(%rdi), %rsp
100         movq    EC_RBX(%rdi), %rbx
101
102         popq    %rbp
103         ret
104 END(efi_rt_arch_call)
105
106 ENTRY(efi_rt_fault)
107         xorl    %eax, %eax
108         movq    PCPU(CURPCB), %rsi
109         movq    %rax, PCB_ONFAULT(%rsi)
110         movl    $EFAULT, %eax
111         movq    PCPU(CURTHREAD), %rbx
112         movq    TD_MD+MD_EFIRT_TMP(%rbx), %rdi
113         jmp     efi_rt_arch_call_tail
114 END(efi_rt_fault)
115
116 efi_rt_panic_str:       .asciz  "efi_rt_arch_call: too many args"