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