blob: feeecaa49c2fa30bd1542b2e3888d6db41d4bf33 [file] [log] [blame]
Arve Hjønnevåg2db97ad2015-05-12 19:23:24 -07001/*
2 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3 *
Arve Hjønnevåg0a661622018-02-01 15:44:04 -08004 * SPDX-License-Identifier: BSD-3-Clause
Arve Hjønnevåg2db97ad2015-05-12 19:23:24 -07005 */
6
7#include <debug.h>
8#include <runtime_svc.h>
9
10#include "generic-arm64-smcall.h"
11
12int trusty_disable_serial_debug;
13
14struct dputc_state {
15 char linebuf[128];
16 unsigned l;
17};
18
19static struct dputc_state dputc_state[2];
20
21static void trusty_dputc(char ch, int secure)
22{
23 unsigned i;
24 struct dputc_state *s = &dputc_state[!secure];
25
26 if (trusty_disable_serial_debug)
27 return;
28
29 s->linebuf[s->l++] = ch;
30 if (s->l == sizeof(s->linebuf) || ch == '\n') {
31 if (secure)
32 printf("secure os: ");
33 else
34 printf("non-secure os: ");
35 for (i = 0; i < s->l; i++) {
36 putchar(s->linebuf[i]);
37 }
38 if (ch != '\n') {
39 printf(" <...>\n");
40 }
41 s->l = 0;
42 }
43}
44
45static uint64_t trusty_get_reg_base(uint32_t reg)
46{
47 switch (reg) {
48 case 0:
49 return PLAT_ARM_GICD_BASE;
50
51 case 1:
52 return PLAT_ARM_GICC_BASE;
53
54 default:
55 NOTICE("%s(0x%x) unknown reg\n", __func__, reg);
56 return SMC_UNK;
57 }
58}
59
Sandrine Bailleux3ed16a12018-08-01 15:55:34 +020060static uintptr_t trusty_generic_platform_smc(uint32_t smc_fid,
61 u_register_t x1,
62 u_register_t x2,
63 u_register_t x3,
64 u_register_t x4,
Arve Hjønnevåg2db97ad2015-05-12 19:23:24 -070065 void *cookie,
66 void *handle,
Sandrine Bailleux3ed16a12018-08-01 15:55:34 +020067 u_register_t flags)
Arve Hjønnevåg2db97ad2015-05-12 19:23:24 -070068{
Arve Hjønnevågee8c3032018-02-28 17:18:55 -080069 switch (smc_fid) {
Arve Hjønnevåg2db97ad2015-05-12 19:23:24 -070070 case SMC_FC_DEBUG_PUTC:
71 trusty_dputc(x1, is_caller_secure(flags));
72 SMC_RET1(handle, 0);
73
74 case SMC_FC_GET_REG_BASE:
75 case SMC_FC64_GET_REG_BASE:
76 SMC_RET1(handle, trusty_get_reg_base(x1));
77
78 default:
79 NOTICE("%s(0x%x, 0x%lx) unknown smc\n", __func__, smc_fid, x1);
80 SMC_RET1(handle, SMC_UNK);
81 }
82}
83
84/* Define a SPD runtime service descriptor for fast SMC calls */
85DECLARE_RT_SVC(
86 trusty_fast,
87
88 SMC_ENTITY_PLATFORM_MONITOR,
89 SMC_ENTITY_PLATFORM_MONITOR,
90 SMC_TYPE_FAST,
91 NULL,
92 trusty_generic_platform_smc
93);
94