aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/platform
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-05 11:16:29 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-05 11:16:29 -0400
commit046f153343e33dcad1be7f6249ea6ff1c6fd9b58 (patch)
tree46da03ea84e1a4fe8eff53891332e715cbf31f3e /arch/x86/platform
parenta0abcf2e8f8017051830f738ac1bf5ef42703243 (diff)
parente33655a386ed3b26ad36fb97a47ebb1c2ca1e928 (diff)
Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into next
Pull x86 EFI updates from Peter Anvin: "A collection of EFI changes. The perhaps most important one is to fully save and restore the FPU state around each invocation of EFI runtime, and to not choke on non-ASCII characters in the boot stub" * 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: efivars: Add compatibility code for compat tasks efivars: Refactor sanity checking code into separate function efivars: Stop passing a struct argument to efivar_validate() efivars: Check size of user object efivars: Use local variables instead of a pointer dereference x86/efi: Save and restore FPU context around efi_calls (i386) x86/efi: Save and restore FPU context around efi_calls (x86_64) x86/efi: Implement a __efi_call_virt macro x86, fpu: Extend the use of static_cpu_has_safe x86/efi: Delete most of the efi_call* macros efi: x86: Handle arbitrary Unicode characters efi: Add get_dram_base() helper function efi: Add shared printk wrapper for consistent prefixing efi: create memory map iteration helper efi: efi-stub-helper cleanup
Diffstat (limited to 'arch/x86/platform')
-rw-r--r--arch/x86/platform/efi/efi.c48
-rw-r--r--arch/x86/platform/efi/efi_stub_64.S81
-rw-r--r--arch/x86/platform/uv/bios_uv.c2
3 files changed, 26 insertions, 105 deletions
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index 3781dd39e8bd..835b24820eaa 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -110,7 +110,7 @@ static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
110 efi_status_t status; 110 efi_status_t status;
111 111
112 spin_lock_irqsave(&rtc_lock, flags); 112 spin_lock_irqsave(&rtc_lock, flags);
113 status = efi_call_virt2(get_time, tm, tc); 113 status = efi_call_virt(get_time, tm, tc);
114 spin_unlock_irqrestore(&rtc_lock, flags); 114 spin_unlock_irqrestore(&rtc_lock, flags);
115 return status; 115 return status;
116} 116}
@@ -121,7 +121,7 @@ static efi_status_t virt_efi_set_time(efi_time_t *tm)
121 efi_status_t status; 121 efi_status_t status;
122 122
123 spin_lock_irqsave(&rtc_lock, flags); 123 spin_lock_irqsave(&rtc_lock, flags);
124 status = efi_call_virt1(set_time, tm); 124 status = efi_call_virt(set_time, tm);
125 spin_unlock_irqrestore(&rtc_lock, flags); 125 spin_unlock_irqrestore(&rtc_lock, flags);
126 return status; 126 return status;
127} 127}
@@ -134,8 +134,7 @@ static efi_status_t virt_efi_get_wakeup_time(efi_bool_t *enabled,
134 efi_status_t status; 134 efi_status_t status;
135 135
136 spin_lock_irqsave(&rtc_lock, flags); 136 spin_lock_irqsave(&rtc_lock, flags);
137 status = efi_call_virt3(get_wakeup_time, 137 status = efi_call_virt(get_wakeup_time, enabled, pending, tm);
138 enabled, pending, tm);
139 spin_unlock_irqrestore(&rtc_lock, flags); 138 spin_unlock_irqrestore(&rtc_lock, flags);
140 return status; 139 return status;
141} 140}
@@ -146,8 +145,7 @@ static efi_status_t virt_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
146 efi_status_t status; 145 efi_status_t status;
147 146
148 spin_lock_irqsave(&rtc_lock, flags); 147 spin_lock_irqsave(&rtc_lock, flags);
149 status = efi_call_virt2(set_wakeup_time, 148 status = efi_call_virt(set_wakeup_time, enabled, tm);
150 enabled, tm);
151 spin_unlock_irqrestore(&rtc_lock, flags); 149 spin_unlock_irqrestore(&rtc_lock, flags);
152 return status; 150 return status;
153} 151}
@@ -158,17 +156,17 @@ static efi_status_t virt_efi_get_variable(efi_char16_t *name,
158 unsigned long *data_size, 156 unsigned long *data_size,
159 void *data) 157 void *data)
160{ 158{
161 return efi_call_virt5(get_variable, 159 return efi_call_virt(get_variable,
162 name, vendor, attr, 160 name, vendor, attr,
163 data_size, data); 161 data_size, data);
164} 162}
165 163
166static efi_status_t virt_efi_get_next_variable(unsigned long *name_size, 164static efi_status_t virt_efi_get_next_variable(unsigned long *name_size,
167 efi_char16_t *name, 165 efi_char16_t *name,
168 efi_guid_t *vendor) 166 efi_guid_t *vendor)
169{ 167{
170 return efi_call_virt3(get_next_variable, 168 return efi_call_virt(get_next_variable,
171 name_size, name, vendor); 169 name_size, name, vendor);
172} 170}
173 171
174static efi_status_t virt_efi_set_variable(efi_char16_t *name, 172static efi_status_t virt_efi_set_variable(efi_char16_t *name,
@@ -177,9 +175,9 @@ static efi_status_t virt_efi_set_variable(efi_char16_t *name,
177 unsigned long data_size, 175 unsigned long data_size,
178 void *data) 176 void *data)
179{ 177{
180 return efi_call_virt5(set_variable, 178 return efi_call_virt(set_variable,
181 name, vendor, attr, 179 name, vendor, attr,
182 data_size, data); 180 data_size, data);
183} 181}
184 182
185static efi_status_t virt_efi_query_variable_info(u32 attr, 183static efi_status_t virt_efi_query_variable_info(u32 attr,
@@ -190,13 +188,13 @@ static efi_status_t virt_efi_query_variable_info(u32 attr,
190 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION) 188 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
191 return EFI_UNSUPPORTED; 189 return EFI_UNSUPPORTED;
192 190
193 return efi_call_virt4(query_variable_info, attr, storage_space, 191 return efi_call_virt(query_variable_info, attr, storage_space,
194 remaining_space, max_variable_size); 192 remaining_space, max_variable_size);
195} 193}
196 194
197static efi_status_t virt_efi_get_next_high_mono_count(u32 *count) 195static efi_status_t virt_efi_get_next_high_mono_count(u32 *count)
198{ 196{
199 return efi_call_virt1(get_next_high_mono_count, count); 197 return efi_call_virt(get_next_high_mono_count, count);
200} 198}
201 199
202static void virt_efi_reset_system(int reset_type, 200static void virt_efi_reset_system(int reset_type,
@@ -204,8 +202,8 @@ static void virt_efi_reset_system(int reset_type,
204 unsigned long data_size, 202 unsigned long data_size,
205 efi_char16_t *data) 203 efi_char16_t *data)
206{ 204{
207 efi_call_virt4(reset_system, reset_type, status, 205 __efi_call_virt(reset_system, reset_type, status,
208 data_size, data); 206 data_size, data);
209} 207}
210 208
211static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules, 209static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules,
@@ -215,7 +213,7 @@ static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules,
215 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION) 213 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
216 return EFI_UNSUPPORTED; 214 return EFI_UNSUPPORTED;
217 215
218 return efi_call_virt3(update_capsule, capsules, count, sg_list); 216 return efi_call_virt(update_capsule, capsules, count, sg_list);
219} 217}
220 218
221static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules, 219static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules,
@@ -226,8 +224,8 @@ static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules,
226 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION) 224 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
227 return EFI_UNSUPPORTED; 225 return EFI_UNSUPPORTED;
228 226
229 return efi_call_virt4(query_capsule_caps, capsules, count, max_size, 227 return efi_call_virt(query_capsule_caps, capsules, count, max_size,
230 reset_type); 228 reset_type);
231} 229}
232 230
233static efi_status_t __init phys_efi_set_virtual_address_map( 231static efi_status_t __init phys_efi_set_virtual_address_map(
@@ -239,9 +237,9 @@ static efi_status_t __init phys_efi_set_virtual_address_map(
239 efi_status_t status; 237 efi_status_t status;
240 238
241 efi_call_phys_prelog(); 239 efi_call_phys_prelog();
242 status = efi_call_phys4(efi_phys.set_virtual_address_map, 240 status = efi_call_phys(efi_phys.set_virtual_address_map,
243 memory_map_size, descriptor_size, 241 memory_map_size, descriptor_size,
244 descriptor_version, virtual_map); 242 descriptor_version, virtual_map);
245 efi_call_phys_epilog(); 243 efi_call_phys_epilog();
246 return status; 244 return status;
247} 245}
diff --git a/arch/x86/platform/efi/efi_stub_64.S b/arch/x86/platform/efi/efi_stub_64.S
index e0984ef0374b..5fcda7272550 100644
--- a/arch/x86/platform/efi/efi_stub_64.S
+++ b/arch/x86/platform/efi/efi_stub_64.S
@@ -73,84 +73,7 @@
73 2: 73 2:
74 .endm 74 .endm
75 75
76ENTRY(efi_call0) 76ENTRY(efi_call)
77 SAVE_XMM
78 subq $32, %rsp
79 SWITCH_PGT
80 call *%rdi
81 RESTORE_PGT
82 addq $32, %rsp
83 RESTORE_XMM
84 ret
85ENDPROC(efi_call0)
86
87ENTRY(efi_call1)
88 SAVE_XMM
89 subq $32, %rsp
90 mov %rsi, %rcx
91 SWITCH_PGT
92 call *%rdi
93 RESTORE_PGT
94 addq $32, %rsp
95 RESTORE_XMM
96 ret
97ENDPROC(efi_call1)
98
99ENTRY(efi_call2)
100 SAVE_XMM
101 subq $32, %rsp
102 mov %rsi, %rcx
103 SWITCH_PGT
104 call *%rdi
105 RESTORE_PGT
106 addq $32, %rsp
107 RESTORE_XMM
108 ret
109ENDPROC(efi_call2)
110
111ENTRY(efi_call3)
112 SAVE_XMM
113 subq $32, %rsp
114 mov %rcx, %r8
115 mov %rsi, %rcx
116 SWITCH_PGT
117 call *%rdi
118 RESTORE_PGT
119 addq $32, %rsp
120 RESTORE_XMM
121 ret
122ENDPROC(efi_call3)
123
124ENTRY(efi_call4)
125 SAVE_XMM
126 subq $32, %rsp
127 mov %r8, %r9
128 mov %rcx, %r8
129 mov %rsi, %rcx
130 SWITCH_PGT
131 call *%rdi
132 RESTORE_PGT
133 addq $32, %rsp
134 RESTORE_XMM
135 ret
136ENDPROC(efi_call4)
137
138ENTRY(efi_call5)
139 SAVE_XMM
140 subq $48, %rsp
141 mov %r9, 32(%rsp)
142 mov %r8, %r9
143 mov %rcx, %r8
144 mov %rsi, %rcx
145 SWITCH_PGT
146 call *%rdi
147 RESTORE_PGT
148 addq $48, %rsp
149 RESTORE_XMM
150 ret
151ENDPROC(efi_call5)
152
153ENTRY(efi_call6)
154 SAVE_XMM 77 SAVE_XMM
155 mov (%rsp), %rax 78 mov (%rsp), %rax
156 mov 8(%rax), %rax 79 mov 8(%rax), %rax
@@ -166,7 +89,7 @@ ENTRY(efi_call6)
166 addq $48, %rsp 89 addq $48, %rsp
167 RESTORE_XMM 90 RESTORE_XMM
168 ret 91 ret
169ENDPROC(efi_call6) 92ENDPROC(efi_call)
170 93
171#ifdef CONFIG_EFI_MIXED 94#ifdef CONFIG_EFI_MIXED
172 95
diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c
index 766612137a62..1584cbed0dce 100644
--- a/arch/x86/platform/uv/bios_uv.c
+++ b/arch/x86/platform/uv/bios_uv.c
@@ -39,7 +39,7 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
39 */ 39 */
40 return BIOS_STATUS_UNIMPLEMENTED; 40 return BIOS_STATUS_UNIMPLEMENTED;
41 41
42 ret = efi_call6((void *)__va(tab->function), (u64)which, 42 ret = efi_call((void *)__va(tab->function), (u64)which,
43 a1, a2, a3, a4, a5); 43 a1, a2, a3, a4, a5);
44 return ret; 44 return ret;
45} 45}