]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
132ec92f BP |
2 | #include <linux/linkage.h> |
3 | #include <linux/errno.h> | |
4 | #include <asm/asm.h> | |
5 | #include <asm/msr.h> | |
6 | ||
7 | #ifdef CONFIG_X86_64 | |
8 | /* | |
1f975f78 | 9 | * int {rdmsr,wrmsr}_safe_regs(u32 gprs[8]); |
132ec92f BP |
10 | * |
11 | * reg layout: u32 gprs[eax, ecx, edx, ebx, esp, ebp, esi, edi] | |
12 | * | |
13 | */ | |
f6909f39 | 14 | .macro op_safe_regs op |
1f975f78 | 15 | ENTRY(\op\()_safe_regs) |
131484c8 | 16 | pushq %rbx |
c207aee4 | 17 | pushq %r12 |
79c5dca3 PA |
18 | movq %rdi, %r10 /* Save pointer */ |
19 | xorl %r11d, %r11d /* Return value */ | |
132ec92f BP |
20 | movl (%rdi), %eax |
21 | movl 4(%rdi), %ecx | |
22 | movl 8(%rdi), %edx | |
23 | movl 12(%rdi), %ebx | |
c207aee4 | 24 | movl 20(%rdi), %r12d |
132ec92f BP |
25 | movl 24(%rdi), %esi |
26 | movl 28(%rdi), %edi | |
27 | 1: \op | |
79c5dca3 PA |
28 | 2: movl %eax, (%r10) |
29 | movl %r11d, %eax /* Return value */ | |
30 | movl %ecx, 4(%r10) | |
31 | movl %edx, 8(%r10) | |
32 | movl %ebx, 12(%r10) | |
c207aee4 | 33 | movl %r12d, 20(%r10) |
79c5dca3 PA |
34 | movl %esi, 24(%r10) |
35 | movl %edi, 28(%r10) | |
c207aee4 | 36 | popq %r12 |
131484c8 | 37 | popq %rbx |
132ec92f BP |
38 | ret |
39 | 3: | |
79c5dca3 | 40 | movl $-EIO, %r11d |
132ec92f | 41 | jmp 2b |
79c5dca3 PA |
42 | |
43 | _ASM_EXTABLE(1b, 3b) | |
1f975f78 | 44 | ENDPROC(\op\()_safe_regs) |
132ec92f BP |
45 | .endm |
46 | ||
47 | #else /* X86_32 */ | |
48 | ||
8adf65cf | 49 | .macro op_safe_regs op |
1f975f78 | 50 | ENTRY(\op\()_safe_regs) |
131484c8 IM |
51 | pushl %ebx |
52 | pushl %ebp | |
53 | pushl %esi | |
54 | pushl %edi | |
55 | pushl $0 /* Return value */ | |
56 | pushl %eax | |
132ec92f BP |
57 | movl 4(%eax), %ecx |
58 | movl 8(%eax), %edx | |
59 | movl 12(%eax), %ebx | |
60 | movl 20(%eax), %ebp | |
61 | movl 24(%eax), %esi | |
62 | movl 28(%eax), %edi | |
63 | movl (%eax), %eax | |
64 | 1: \op | |
131484c8 | 65 | 2: pushl %eax |
132ec92f | 66 | movl 4(%esp), %eax |
131484c8 | 67 | popl (%eax) |
132ec92f BP |
68 | addl $4, %esp |
69 | movl %ecx, 4(%eax) | |
70 | movl %edx, 8(%eax) | |
71 | movl %ebx, 12(%eax) | |
72 | movl %ebp, 20(%eax) | |
73 | movl %esi, 24(%eax) | |
74 | movl %edi, 28(%eax) | |
131484c8 IM |
75 | popl %eax |
76 | popl %edi | |
77 | popl %esi | |
78 | popl %ebp | |
79 | popl %ebx | |
132ec92f BP |
80 | ret |
81 | 3: | |
82 | movl $-EIO, 4(%esp) | |
83 | jmp 2b | |
79c5dca3 PA |
84 | |
85 | _ASM_EXTABLE(1b, 3b) | |
1f975f78 | 86 | ENDPROC(\op\()_safe_regs) |
132ec92f BP |
87 | .endm |
88 | ||
89 | #endif | |
90 | ||
91 | op_safe_regs rdmsr | |
92 | op_safe_regs wrmsr | |
93 |