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