Commit | Line | Data |
---|---|---|
132ec92f BP |
1 | #include <linux/linkage.h> |
2 | #include <linux/errno.h> | |
79c5dca3 | 3 | #include <asm/dwarf2.h> |
132ec92f BP |
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) |
79c5dca3 PA |
16 | CFI_STARTPROC |
17 | pushq_cfi %rbx | |
18 | pushq_cfi %rbp | |
19 | movq %rdi, %r10 /* Save pointer */ | |
20 | xorl %r11d, %r11d /* Return value */ | |
132ec92f BP |
21 | movl (%rdi), %eax |
22 | movl 4(%rdi), %ecx | |
23 | movl 8(%rdi), %edx | |
24 | movl 12(%rdi), %ebx | |
25 | movl 20(%rdi), %ebp | |
26 | movl 24(%rdi), %esi | |
27 | movl 28(%rdi), %edi | |
79c5dca3 | 28 | CFI_REMEMBER_STATE |
132ec92f | 29 | 1: \op |
79c5dca3 PA |
30 | 2: movl %eax, (%r10) |
31 | movl %r11d, %eax /* Return value */ | |
32 | movl %ecx, 4(%r10) | |
33 | movl %edx, 8(%r10) | |
34 | movl %ebx, 12(%r10) | |
35 | movl %ebp, 20(%r10) | |
36 | movl %esi, 24(%r10) | |
37 | movl %edi, 28(%r10) | |
38 | popq_cfi %rbp | |
39 | popq_cfi %rbx | |
132ec92f BP |
40 | ret |
41 | 3: | |
79c5dca3 PA |
42 | CFI_RESTORE_STATE |
43 | movl $-EIO, %r11d | |
132ec92f | 44 | jmp 2b |
79c5dca3 PA |
45 | |
46 | _ASM_EXTABLE(1b, 3b) | |
47 | CFI_ENDPROC | |
1f975f78 | 48 | ENDPROC(\op\()_safe_regs) |
132ec92f BP |
49 | .endm |
50 | ||
51 | #else /* X86_32 */ | |
52 | ||
8adf65cf | 53 | .macro op_safe_regs op |
1f975f78 | 54 | ENTRY(\op\()_safe_regs) |
79c5dca3 PA |
55 | CFI_STARTPROC |
56 | pushl_cfi %ebx | |
57 | pushl_cfi %ebp | |
58 | pushl_cfi %esi | |
59 | pushl_cfi %edi | |
60 | pushl_cfi $0 /* Return value */ | |
61 | pushl_cfi %eax | |
132ec92f BP |
62 | movl 4(%eax), %ecx |
63 | movl 8(%eax), %edx | |
64 | movl 12(%eax), %ebx | |
65 | movl 20(%eax), %ebp | |
66 | movl 24(%eax), %esi | |
67 | movl 28(%eax), %edi | |
68 | movl (%eax), %eax | |
79c5dca3 | 69 | CFI_REMEMBER_STATE |
132ec92f | 70 | 1: \op |
79c5dca3 | 71 | 2: pushl_cfi %eax |
132ec92f | 72 | movl 4(%esp), %eax |
79c5dca3 | 73 | popl_cfi (%eax) |
132ec92f | 74 | addl $4, %esp |
79c5dca3 | 75 | CFI_ADJUST_CFA_OFFSET -4 |
132ec92f BP |
76 | movl %ecx, 4(%eax) |
77 | movl %edx, 8(%eax) | |
78 | movl %ebx, 12(%eax) | |
79 | movl %ebp, 20(%eax) | |
80 | movl %esi, 24(%eax) | |
81 | movl %edi, 28(%eax) | |
79c5dca3 PA |
82 | popl_cfi %eax |
83 | popl_cfi %edi | |
84 | popl_cfi %esi | |
85 | popl_cfi %ebp | |
86 | popl_cfi %ebx | |
132ec92f BP |
87 | ret |
88 | 3: | |
79c5dca3 | 89 | CFI_RESTORE_STATE |
132ec92f BP |
90 | movl $-EIO, 4(%esp) |
91 | jmp 2b | |
79c5dca3 PA |
92 | |
93 | _ASM_EXTABLE(1b, 3b) | |
94 | CFI_ENDPROC | |
1f975f78 | 95 | ENDPROC(\op\()_safe_regs) |
132ec92f BP |
96 | .endm |
97 | ||
98 | #endif | |
99 | ||
100 | op_safe_regs rdmsr | |
101 | op_safe_regs wrmsr | |
102 |