161496151SArve Hjønnevåg /* 261496151SArve Hjønnevåg * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 361496151SArve Hjønnevåg * 4*64b33235SArve Hjønnevåg * SPDX-License-Identifier: BSD-3-Clause 561496151SArve Hjønnevåg */ 661496151SArve Hjønnevåg 761496151SArve Hjønnevåg #include <debug.h> 861496151SArve Hjønnevåg #include <runtime_svc.h> 961496151SArve Hjønnevåg 1061496151SArve Hjønnevåg #include "generic-arm64-smcall.h" 1161496151SArve Hjønnevåg 1261496151SArve Hjønnevåg int trusty_disable_serial_debug; 1361496151SArve Hjønnevåg 1461496151SArve Hjønnevåg struct dputc_state { 1561496151SArve Hjønnevåg char linebuf[128]; 1661496151SArve Hjønnevåg unsigned l; 1761496151SArve Hjønnevåg }; 1861496151SArve Hjønnevåg 1961496151SArve Hjønnevåg static struct dputc_state dputc_state[2]; 2061496151SArve Hjønnevåg 2161496151SArve Hjønnevåg static void trusty_dputc(char ch, int secure) 2261496151SArve Hjønnevåg { 2361496151SArve Hjønnevåg unsigned i; 2461496151SArve Hjønnevåg struct dputc_state *s = &dputc_state[!secure]; 2561496151SArve Hjønnevåg 2661496151SArve Hjønnevåg if (trusty_disable_serial_debug) 2761496151SArve Hjønnevåg return; 2861496151SArve Hjønnevåg 2961496151SArve Hjønnevåg s->linebuf[s->l++] = ch; 3061496151SArve Hjønnevåg if (s->l == sizeof(s->linebuf) || ch == '\n') { 3161496151SArve Hjønnevåg if (secure) 3261496151SArve Hjønnevåg printf("secure os: "); 3361496151SArve Hjønnevåg else 3461496151SArve Hjønnevåg printf("non-secure os: "); 3561496151SArve Hjønnevåg for (i = 0; i < s->l; i++) { 3661496151SArve Hjønnevåg putchar(s->linebuf[i]); 3761496151SArve Hjønnevåg } 3861496151SArve Hjønnevåg if (ch != '\n') { 3961496151SArve Hjønnevåg printf(" <...>\n"); 4061496151SArve Hjønnevåg } 4161496151SArve Hjønnevåg s->l = 0; 4261496151SArve Hjønnevåg } 4361496151SArve Hjønnevåg } 4461496151SArve Hjønnevåg 4561496151SArve Hjønnevåg static uint64_t trusty_get_reg_base(uint32_t reg) 4661496151SArve Hjønnevåg { 4761496151SArve Hjønnevåg switch (reg) { 4861496151SArve Hjønnevåg case 0: 4961496151SArve Hjønnevåg return PLAT_ARM_GICD_BASE; 5061496151SArve Hjønnevåg 5161496151SArve Hjønnevåg case 1: 5261496151SArve Hjønnevåg return PLAT_ARM_GICC_BASE; 5361496151SArve Hjønnevåg 5461496151SArve Hjønnevåg default: 5561496151SArve Hjønnevåg NOTICE("%s(0x%x) unknown reg\n", __func__, reg); 5661496151SArve Hjønnevåg return SMC_UNK; 5761496151SArve Hjønnevåg } 5861496151SArve Hjønnevåg } 5961496151SArve Hjønnevåg 6061496151SArve Hjønnevåg static uint64_t trusty_generic_platform_smc(uint32_t smc_fid, 6161496151SArve Hjønnevåg uint64_t x1, 6261496151SArve Hjønnevåg uint64_t x2, 6361496151SArve Hjønnevåg uint64_t x3, 6461496151SArve Hjønnevåg uint64_t x4, 6561496151SArve Hjønnevåg void *cookie, 6661496151SArve Hjønnevåg void *handle, 6761496151SArve Hjønnevåg uint64_t flags) 6861496151SArve Hjønnevåg { 6961496151SArve Hjønnevåg switch(smc_fid) { 7061496151SArve Hjønnevåg case SMC_FC_DEBUG_PUTC: 7161496151SArve Hjønnevåg trusty_dputc(x1, is_caller_secure(flags)); 7261496151SArve Hjønnevåg SMC_RET1(handle, 0); 7361496151SArve Hjønnevåg 7461496151SArve Hjønnevåg case SMC_FC_GET_REG_BASE: 7561496151SArve Hjønnevåg case SMC_FC64_GET_REG_BASE: 7661496151SArve Hjønnevåg SMC_RET1(handle, trusty_get_reg_base(x1)); 7761496151SArve Hjønnevåg 7861496151SArve Hjønnevåg default: 7961496151SArve Hjønnevåg NOTICE("%s(0x%x, 0x%lx) unknown smc\n", __func__, smc_fid, x1); 8061496151SArve Hjønnevåg SMC_RET1(handle, SMC_UNK); 8161496151SArve Hjønnevåg } 8261496151SArve Hjønnevåg } 8361496151SArve Hjønnevåg 8461496151SArve Hjønnevåg /* Define a SPD runtime service descriptor for fast SMC calls */ 8561496151SArve Hjønnevåg DECLARE_RT_SVC( 8661496151SArve Hjønnevåg trusty_fast, 8761496151SArve Hjønnevåg 8861496151SArve Hjønnevåg SMC_ENTITY_PLATFORM_MONITOR, 8961496151SArve Hjønnevåg SMC_ENTITY_PLATFORM_MONITOR, 9061496151SArve Hjønnevåg SMC_TYPE_FAST, 9161496151SArve Hjønnevåg NULL, 9261496151SArve Hjønnevåg trusty_generic_platform_smc 9361496151SArve Hjønnevåg ); 9461496151SArve Hjønnevåg 95