161496151SArve Hjønnevåg /* 2*10608a63SAntonio Nino Diaz * Copyright (c) 2016-2019, 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 909d40e0eSAntonio Nino Diaz #include <common/debug.h> 1009d40e0eSAntonio Nino Diaz #include <common/runtime_svc.h> 11*10608a63SAntonio Nino Diaz #include <platform_def.h> 1209d40e0eSAntonio Nino Diaz 1361496151SArve Hjønnevåg #include "generic-arm64-smcall.h" 1461496151SArve Hjønnevåg 1561496151SArve Hjønnevåg int trusty_disable_serial_debug; 1661496151SArve Hjønnevåg 1761496151SArve Hjønnevåg struct dputc_state { 1861496151SArve Hjønnevåg char linebuf[128]; 1961496151SArve Hjønnevåg unsigned l; 2061496151SArve Hjønnevåg }; 2161496151SArve Hjønnevåg 2261496151SArve Hjønnevåg static struct dputc_state dputc_state[2]; 2361496151SArve Hjønnevåg 2461496151SArve Hjønnevåg static void trusty_dputc(char ch, int secure) 2561496151SArve Hjønnevåg { 2661496151SArve Hjønnevåg unsigned i; 2761496151SArve Hjønnevåg struct dputc_state *s = &dputc_state[!secure]; 2861496151SArve Hjønnevåg 2961496151SArve Hjønnevåg if (trusty_disable_serial_debug) 3061496151SArve Hjønnevåg return; 3161496151SArve Hjønnevåg 3261496151SArve Hjønnevåg s->linebuf[s->l++] = ch; 3361496151SArve Hjønnevåg if (s->l == sizeof(s->linebuf) || ch == '\n') { 3461496151SArve Hjønnevåg if (secure) 3539b6cc66SAntonio Nino Diaz printf("secure os: "); 3661496151SArve Hjønnevåg else 3739b6cc66SAntonio Nino Diaz printf("non-secure os: "); 3861496151SArve Hjønnevåg for (i = 0; i < s->l; i++) { 3961496151SArve Hjønnevåg putchar(s->linebuf[i]); 4061496151SArve Hjønnevåg } 4161496151SArve Hjønnevåg if (ch != '\n') { 4239b6cc66SAntonio Nino Diaz printf(" <...>\n"); 4361496151SArve Hjønnevåg } 4461496151SArve Hjønnevåg s->l = 0; 4561496151SArve Hjønnevåg } 4661496151SArve Hjønnevåg } 4761496151SArve Hjønnevåg 4861496151SArve Hjønnevåg static uint64_t trusty_get_reg_base(uint32_t reg) 4961496151SArve Hjønnevåg { 5061496151SArve Hjønnevåg switch (reg) { 5161496151SArve Hjønnevåg case 0: 5261496151SArve Hjønnevåg return PLAT_ARM_GICD_BASE; 5361496151SArve Hjønnevåg 5461496151SArve Hjønnevåg case 1: 5561496151SArve Hjønnevåg return PLAT_ARM_GICC_BASE; 5661496151SArve Hjønnevåg 5761496151SArve Hjønnevåg default: 5861496151SArve Hjønnevåg NOTICE("%s(0x%x) unknown reg\n", __func__, reg); 5961496151SArve Hjønnevåg return SMC_UNK; 6061496151SArve Hjønnevåg } 6161496151SArve Hjønnevåg } 6261496151SArve Hjønnevåg 632de6deaaSSandrine Bailleux static uintptr_t trusty_generic_platform_smc(uint32_t smc_fid, 642de6deaaSSandrine Bailleux u_register_t x1, 652de6deaaSSandrine Bailleux u_register_t x2, 662de6deaaSSandrine Bailleux u_register_t x3, 672de6deaaSSandrine Bailleux u_register_t x4, 6861496151SArve Hjønnevåg void *cookie, 6961496151SArve Hjønnevåg void *handle, 702de6deaaSSandrine Bailleux u_register_t flags) 7161496151SArve Hjønnevåg { 7261496151SArve Hjønnevåg switch (smc_fid) { 7361496151SArve Hjønnevåg case SMC_FC_DEBUG_PUTC: 7461496151SArve Hjønnevåg trusty_dputc(x1, is_caller_secure(flags)); 7561496151SArve Hjønnevåg SMC_RET1(handle, 0); 7661496151SArve Hjønnevåg 7761496151SArve Hjønnevåg case SMC_FC_GET_REG_BASE: 7861496151SArve Hjønnevåg case SMC_FC64_GET_REG_BASE: 7961496151SArve Hjønnevåg SMC_RET1(handle, trusty_get_reg_base(x1)); 8061496151SArve Hjønnevåg 8161496151SArve Hjønnevåg default: 8261496151SArve Hjønnevåg NOTICE("%s(0x%x, 0x%lx) unknown smc\n", __func__, smc_fid, x1); 8361496151SArve Hjønnevåg SMC_RET1(handle, SMC_UNK); 8461496151SArve Hjønnevåg } 8561496151SArve Hjønnevåg } 8661496151SArve Hjønnevåg 8761496151SArve Hjønnevåg /* Define a SPD runtime service descriptor for fast SMC calls */ 8861496151SArve Hjønnevåg DECLARE_RT_SVC( 8961496151SArve Hjønnevåg trusty_fast, 9061496151SArve Hjønnevåg 9161496151SArve Hjønnevåg SMC_ENTITY_PLATFORM_MONITOR, 9261496151SArve Hjønnevåg SMC_ENTITY_PLATFORM_MONITOR, 9361496151SArve Hjønnevåg SMC_TYPE_FAST, 9461496151SArve Hjønnevåg NULL, 9561496151SArve Hjønnevåg trusty_generic_platform_smc 9661496151SArve Hjønnevåg ); 9761496151SArve Hjønnevåg 98