18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * hibernate.c: Hibernaton support specific for sparc64. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2013 Kirill V Tkhai (tkhai@yandex.ru) 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/mm.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <asm/hibernate.h> 118c2ecf20Sopenharmony_ci#include <asm/visasm.h> 128c2ecf20Sopenharmony_ci#include <asm/page.h> 138c2ecf20Sopenharmony_ci#include <asm/sections.h> 148c2ecf20Sopenharmony_ci#include <asm/tlb.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistruct saved_context saved_context; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci/* 198c2ecf20Sopenharmony_ci * pfn_is_nosave - check if given pfn is in the 'nosave' section 208c2ecf20Sopenharmony_ci */ 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ciint pfn_is_nosave(unsigned long pfn) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci unsigned long nosave_begin_pfn = PFN_DOWN((unsigned long)&__nosave_begin); 258c2ecf20Sopenharmony_ci unsigned long nosave_end_pfn = PFN_DOWN((unsigned long)&__nosave_end); 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn); 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_civoid save_processor_state(void) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci save_and_clear_fpu(); 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_civoid restore_processor_state(void) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci struct mm_struct *mm = current->active_mm; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci tsb_context_switch_ctx(mm, CTX_HWBITS(mm->context)); 408c2ecf20Sopenharmony_ci} 41