Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags   |
/* SPDX-License-Identifier: GPL-2.0 */
/*
* This may not use any stack, nor any variable that is not "NoSave":
*
* Its rewriting one kernel image with another. What is stack in "old"
* image could very well be data page in "new" image, and overwriting
* your own stack under you is bad idea.
*/
#include <linux/linkage.h>
#include <asm/segment.h>
#include <asm/page_types.h>
#include <asm/asm-offsets.h>
#include <asm/processor-flags.h>
#include <asm/frame.h>
.text
SYM_FUNC_START(swsusp_arch_suspend)
<------>movl %esp, saved_context_esp
<------>movl %ebx, saved_context_ebx
<------>movl %ebp, saved_context_ebp
<------>movl %esi, saved_context_esi
<------>movl %edi, saved_context_edi
<------>pushfl
<------>popl saved_context_eflags
<------>/* save cr3 */
<------>movl %cr3, %eax
<------>movl %eax, restore_cr3
<------>FRAME_BEGIN
<------>call swsusp_save
<------>FRAME_END
<------>ret
SYM_FUNC_END(swsusp_arch_suspend)
SYM_CODE_START(restore_image)
<------>/* prepare to jump to the image kernel */
<------>movl restore_jump_address, %ebx
<------>movl restore_cr3, %ebp
<------>movl mmu_cr4_features, %ecx
<------>/* jump to relocated restore code */
<------>movl relocated_restore_code, %eax
<------>jmpl *%eax
SYM_CODE_END(restore_image)
/* code below has been relocated to a safe page */
SYM_CODE_START(core_restore_code)
<------>movl temp_pgt, %eax
<------>movl %eax, %cr3
<------>jecxz 1f # cr4 Pentium and higher, skip if zero
<------>andl $~(X86_CR4_PGE), %ecx
<------>movl %ecx, %cr4; # turn off PGE
<------>movl %cr3, %eax; # flush TLB
<------>movl %eax, %cr3
1:
<------>movl restore_pblist, %edx
<------>.p2align 4,,7
copy_loop:
<------>testl %edx, %edx
<------>jz done
<------>movl pbe_address(%edx), %esi
<------>movl pbe_orig_address(%edx), %edi
<------>movl $(PAGE_SIZE >> 2), %ecx
<------>rep
<------>movsl
<------>movl pbe_next(%edx), %edx
<------>jmp copy_loop
<------>.p2align 4,,7
done:
<------>jmpl *%ebx
SYM_CODE_END(core_restore_code)
<------>/* code below belongs to the image kernel */
<------>.align PAGE_SIZE
SYM_FUNC_START(restore_registers)
<------>/* go back to the original page tables */
<------>movl %ebp, %cr3
<------>movl mmu_cr4_features, %ecx
<------>jecxz 1f # cr4 Pentium and higher, skip if zero
<------>movl %ecx, %cr4; # turn PGE back on
1:
<------>movl saved_context_esp, %esp
<------>movl saved_context_ebp, %ebp
<------>movl saved_context_ebx, %ebx
<------>movl saved_context_esi, %esi
<------>movl saved_context_edi, %edi
<------>pushl saved_context_eflags
<------>popfl
<------>/* Saved in save_processor_state. */
<------>movl $saved_context, %eax
<------>lgdt saved_context_gdt_desc(%eax)
<------>xorl %eax, %eax
<------>/* tell the hibernation core that we've just restored the memory */
<------>movl %eax, in_suspend
<------>ret
SYM_FUNC_END(restore_registers)