@@ -143,18 +143,20 @@ static efi_status_t mm_communicate(u8 *comm_buf, size_t payload_size)
143143 return var_hdr -> ret_status ;
144144}
145145
146+ #define COMM_BUF_SIZE (__payload_size ) (MM_COMMUNICATE_HEADER_SIZE + \
147+ MM_VARIABLE_COMMUNICATE_SIZE + \
148+ (__payload_size))
149+
146150/**
147151 * setup_mm_hdr() - Allocate a buffer for StandAloneMM and initialize the
148152 * header data.
149153 *
150154 * @dptr: pointer address to store allocated buffer
151155 * @payload_size: payload size
152156 * @func: standAloneMM function number
153- * @ret: EFI return code
154157 * Return: pointer to corresponding StandAloneMM function buffer or NULL
155158 */
156- static void * setup_mm_hdr (u8 * * dptr , size_t payload_size , size_t func ,
157- efi_status_t * ret )
159+ static void * setup_mm_hdr (u8 * * dptr , size_t payload_size , size_t func )
158160{
159161 const efi_guid_t mm_var_guid = EFI_MM_VARIABLE_GUID ;
160162 struct efi_mm_communicate_header * mm_hdr ;
@@ -169,27 +171,21 @@ static void *setup_mm_hdr(u8 **dptr, size_t payload_size, size_t func,
169171 if (max_buffer_size &&
170172 max_buffer_size < (MM_COMMUNICATE_HEADER_SIZE +
171173 MM_VARIABLE_COMMUNICATE_SIZE + payload_size )) {
172- * ret = EFI_INVALID_PARAMETER ;
173174 return NULL ;
174175 }
175176
176- comm_buf = kzalloc (MM_COMMUNICATE_HEADER_SIZE +
177- MM_VARIABLE_COMMUNICATE_SIZE + payload_size ,
178- GFP_KERNEL );
179- if (!comm_buf ) {
180- * ret = EFI_OUT_OF_RESOURCES ;
177+ comm_buf = alloc_pages_exact (COMM_BUF_SIZE (payload_size ),
178+ GFP_KERNEL | __GFP_ZERO );
179+ if (!comm_buf )
181180 return NULL ;
182- }
183181
184182 mm_hdr = (struct efi_mm_communicate_header * )comm_buf ;
185183 memcpy (& mm_hdr -> header_guid , & mm_var_guid , sizeof (mm_hdr -> header_guid ));
186184 mm_hdr -> message_len = MM_VARIABLE_COMMUNICATE_SIZE + payload_size ;
187185
188186 var_hdr = (struct smm_variable_communicate_header * )mm_hdr -> data ;
189187 var_hdr -> function = func ;
190- if (dptr )
191- * dptr = comm_buf ;
192- * ret = EFI_SUCCESS ;
188+ * dptr = comm_buf ;
193189
194190 return var_hdr -> data ;
195191}
@@ -212,10 +208,9 @@ static efi_status_t get_max_payload(size_t *size)
212208
213209 payload_size = sizeof (* var_payload );
214210 var_payload = setup_mm_hdr (& comm_buf , payload_size ,
215- SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE ,
216- & ret );
211+ SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE );
217212 if (!var_payload )
218- return EFI_OUT_OF_RESOURCES ;
213+ return EFI_DEVICE_ERROR ;
219214
220215 ret = mm_communicate (comm_buf , payload_size );
221216 if (ret != EFI_SUCCESS )
@@ -239,7 +234,7 @@ static efi_status_t get_max_payload(size_t *size)
239234 */
240235 * size -= 2 ;
241236out :
242- kfree (comm_buf );
237+ free_pages_exact (comm_buf , COMM_BUF_SIZE ( payload_size ) );
243238 return ret ;
244239}
245240
@@ -259,9 +254,9 @@ static efi_status_t get_property_int(u16 *name, size_t name_size,
259254
260255 smm_property = setup_mm_hdr (
261256 & comm_buf , payload_size ,
262- SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET , & ret );
257+ SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET );
263258 if (!smm_property )
264- return EFI_OUT_OF_RESOURCES ;
259+ return EFI_DEVICE_ERROR ;
265260
266261 memcpy (& smm_property -> guid , vendor , sizeof (smm_property -> guid ));
267262 smm_property -> name_size = name_size ;
@@ -282,7 +277,7 @@ static efi_status_t get_property_int(u16 *name, size_t name_size,
282277 memcpy (var_property , & smm_property -> property , sizeof (* var_property ));
283278
284279out :
285- kfree (comm_buf );
280+ free_pages_exact (comm_buf , COMM_BUF_SIZE ( payload_size ) );
286281 return ret ;
287282}
288283
@@ -315,9 +310,9 @@ static efi_status_t tee_get_variable(u16 *name, efi_guid_t *vendor,
315310
316311 payload_size = MM_VARIABLE_ACCESS_HEADER_SIZE + name_size + tmp_dsize ;
317312 var_acc = setup_mm_hdr (& comm_buf , payload_size ,
318- SMM_VARIABLE_FUNCTION_GET_VARIABLE , & ret );
313+ SMM_VARIABLE_FUNCTION_GET_VARIABLE );
319314 if (!var_acc )
320- return EFI_OUT_OF_RESOURCES ;
315+ return EFI_DEVICE_ERROR ;
321316
322317 /* Fill in contents */
323318 memcpy (& var_acc -> guid , vendor , sizeof (var_acc -> guid ));
@@ -347,7 +342,7 @@ static efi_status_t tee_get_variable(u16 *name, efi_guid_t *vendor,
347342 memcpy (data , (u8 * )var_acc -> name + var_acc -> name_size ,
348343 var_acc -> data_size );
349344out :
350- kfree (comm_buf );
345+ free_pages_exact (comm_buf , COMM_BUF_SIZE ( payload_size ) );
351346 return ret ;
352347}
353348
@@ -380,10 +375,9 @@ static efi_status_t tee_get_next_variable(unsigned long *name_size,
380375
381376 payload_size = MM_VARIABLE_GET_NEXT_HEADER_SIZE + out_name_size ;
382377 var_getnext = setup_mm_hdr (& comm_buf , payload_size ,
383- SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME ,
384- & ret );
378+ SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME );
385379 if (!var_getnext )
386- return EFI_OUT_OF_RESOURCES ;
380+ return EFI_DEVICE_ERROR ;
387381
388382 /* Fill in contents */
389383 memcpy (& var_getnext -> guid , guid , sizeof (var_getnext -> guid ));
@@ -404,7 +398,7 @@ static efi_status_t tee_get_next_variable(unsigned long *name_size,
404398 memcpy (name , var_getnext -> name , var_getnext -> name_size );
405399
406400out :
407- kfree (comm_buf );
401+ free_pages_exact (comm_buf , COMM_BUF_SIZE ( payload_size ) );
408402 return ret ;
409403}
410404
@@ -437,9 +431,9 @@ static efi_status_t tee_set_variable(efi_char16_t *name, efi_guid_t *vendor,
437431 * the properties, if the allocation fails
438432 */
439433 var_acc = setup_mm_hdr (& comm_buf , payload_size ,
440- SMM_VARIABLE_FUNCTION_SET_VARIABLE , & ret );
434+ SMM_VARIABLE_FUNCTION_SET_VARIABLE );
441435 if (!var_acc )
442- return EFI_OUT_OF_RESOURCES ;
436+ return EFI_DEVICE_ERROR ;
443437
444438 /*
445439 * The API has the ability to override RO flags. If no RO check was
@@ -467,7 +461,7 @@ static efi_status_t tee_set_variable(efi_char16_t *name, efi_guid_t *vendor,
467461 ret = mm_communicate (comm_buf , payload_size );
468462 dev_dbg (pvt_data .dev , "Set Variable %s %d %lx\n" , __FILE__ , __LINE__ , ret );
469463out :
470- kfree (comm_buf );
464+ free_pages_exact (comm_buf , COMM_BUF_SIZE ( payload_size ) );
471465 return ret ;
472466}
473467
@@ -492,10 +486,9 @@ static efi_status_t tee_query_variable_info(u32 attributes,
492486
493487 payload_size = sizeof (* mm_query_info );
494488 mm_query_info = setup_mm_hdr (& comm_buf , payload_size ,
495- SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO ,
496- & ret );
489+ SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO );
497490 if (!mm_query_info )
498- return EFI_OUT_OF_RESOURCES ;
491+ return EFI_DEVICE_ERROR ;
499492
500493 mm_query_info -> attr = attributes ;
501494 ret = mm_communicate (comm_buf , payload_size );
@@ -507,7 +500,7 @@ static efi_status_t tee_query_variable_info(u32 attributes,
507500 * max_variable_size = mm_query_info -> max_variable_size ;
508501
509502out :
510- kfree (comm_buf );
503+ free_pages_exact (comm_buf , COMM_BUF_SIZE ( payload_size ) );
511504 return ret ;
512505}
513506
0 commit comments