1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #include <assert.h> 8*54fd6939SJiyong Park #include <limits.h> 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <lib/utils.h> 11*54fd6939SJiyong Park 12*54fd6939SJiyong Park #include "psci_private.h" 13*54fd6939SJiyong Park psci_mem_protect(unsigned int enable)14*54fd6939SJiyong Parku_register_t psci_mem_protect(unsigned int enable) 15*54fd6939SJiyong Park { 16*54fd6939SJiyong Park int val; 17*54fd6939SJiyong Park 18*54fd6939SJiyong Park assert(psci_plat_pm_ops->read_mem_protect != NULL); 19*54fd6939SJiyong Park assert(psci_plat_pm_ops->write_mem_protect != NULL); 20*54fd6939SJiyong Park 21*54fd6939SJiyong Park if (psci_plat_pm_ops->read_mem_protect(&val) < 0) 22*54fd6939SJiyong Park return (u_register_t) PSCI_E_NOT_SUPPORTED; 23*54fd6939SJiyong Park if (psci_plat_pm_ops->write_mem_protect(enable) < 0) 24*54fd6939SJiyong Park return (u_register_t) PSCI_E_NOT_SUPPORTED; 25*54fd6939SJiyong Park 26*54fd6939SJiyong Park return (val != 0) ? 1U : 0U; 27*54fd6939SJiyong Park } 28*54fd6939SJiyong Park psci_mem_chk_range(uintptr_t base,u_register_t length)29*54fd6939SJiyong Parku_register_t psci_mem_chk_range(uintptr_t base, u_register_t length) 30*54fd6939SJiyong Park { 31*54fd6939SJiyong Park int ret; 32*54fd6939SJiyong Park 33*54fd6939SJiyong Park assert(psci_plat_pm_ops->mem_protect_chk != NULL); 34*54fd6939SJiyong Park 35*54fd6939SJiyong Park if ((length == 0U) || check_uptr_overflow(base, length - 1U)) 36*54fd6939SJiyong Park return (u_register_t) PSCI_E_DENIED; 37*54fd6939SJiyong Park 38*54fd6939SJiyong Park ret = psci_plat_pm_ops->mem_protect_chk(base, length); 39*54fd6939SJiyong Park return (ret < 0) ? 40*54fd6939SJiyong Park (u_register_t) PSCI_E_DENIED : (u_register_t) PSCI_E_SUCCESS; 41*54fd6939SJiyong Park } 42