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