.code32
 #ifdef CONFIG_EFI_HANDOVER_PROTOCOL
 SYM_FUNC_START(efi32_stub_entry)
+       call    1f
+1:     popl    %ecx
+
+       /* Clear BSS */
+       xorl    %eax, %eax
+       leal    (_bss - 1b)(%ecx), %edi
+       leal    (_ebss - 1b)(%ecx), %ecx
+       subl    %edi, %ecx
+       shrl    $2, %ecx
+       cld
+       rep     stosl
+
        add     $0x4, %esp              /* Discard return address */
        popl    %ecx
        popl    %edx
        .org    efi32_stub_entry + 0x200
        .code64
 SYM_FUNC_START_NOALIGN(efi64_stub_entry)
-       jmp     efi_stub_entry
+       jmp     efi_handover_entry
 SYM_FUNC_END(efi64_stub_entry)
 #endif
 
 
 }
 
 #ifdef CONFIG_EFI_HANDOVER_PROTOCOL
+void efi_handover_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg,
+                       struct boot_params *boot_params)
+{
+       extern char _bss[], _ebss[];
+
+       memset(_bss, 0, _ebss - _bss);
+       efi_stub_entry(handle, sys_table_arg, boot_params);
+}
+
 #ifndef CONFIG_EFI_MIXED
-extern __alias(efi_stub_entry)
+extern __alias(efi_handover_entry)
 void efi32_stub_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg,
                      struct boot_params *boot_params);
 
-extern __alias(efi_stub_entry)
+extern __alias(efi_handover_entry)
 void efi64_stub_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg,
                      struct boot_params *boot_params);
 #endif