1/*
2 * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3 * Decription: for pages log cfg api define
4 *
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14#include "log_cfg_api.h"
15
16#include <linux/sizes.h>
17#include <linux/module.h>
18#include <linux/kernel.h>
19#include <linux/sysfs.h>
20#include <linux/semaphore.h>
21#include <linux/kthread.h>
22#include <linux/delay.h>
23#include <linux/stat.h>
24#include <linux/uaccess.h>
25#include <linux/syscalls.h>
26#include <linux/slab.h>
27
28#include <securec.h>
29#include "tc_ns_log.h"
30#include "tlogger.h"
31#include "shared_mem.h"
32
33void unregister_log_exception(void)
34{
35}
36
37int register_log_exception(void)
38{
39	return 0;
40}
41
42struct pages_module_result {
43	uint64_t log_addr;
44	uint32_t log_len;
45};
46
47struct pages_module_result g_mem_info = {0};
48
49static int tee_pages_register_core(void)
50{
51	if (g_mem_info.log_addr != 0 || g_mem_info.log_len != 0) {
52		if (memset_s((void *)g_mem_info.log_addr,  g_mem_info.log_len, 0,  g_mem_info.log_len) != 0) {
53			tloge("clean log memory failed\n");
54			return -EFAULT;
55		}
56		return 0;
57	}
58
59	g_mem_info.log_addr = get_log_mem_vaddr();
60	if (IS_ERR_OR_NULL((void *)(uintptr_t)g_mem_info.log_addr)) {
61		tloge("get log mem error\n");
62		return -1;
63	}
64	g_mem_info.log_len = PAGES_LOG_MEM_LEN;
65	return 0;
66}
67
68/* Register log memory */
69int register_log_mem(uint64_t *addr, uint32_t *len)
70{
71	int ret;
72	uint64_t mem_addr;
73	uint32_t mem_len;
74
75	if (!addr || !len) {
76		tloge("addr or len is invalid\n");
77		return -1;
78	}
79
80	ret = tee_pages_register_core();
81	if (ret != 0)
82		return ret;
83
84	mem_addr = get_log_mem_paddr(g_mem_info.log_addr);
85	mem_len = g_mem_info.log_len;
86
87	ret = register_mem_to_teeos(mem_addr, mem_len, true);
88	if (ret != 0)
89		return ret;
90
91	*addr = g_mem_info.log_addr;
92	*len = g_mem_info.log_len;
93	return ret;
94}
95
96void report_log_system_error(void)
97{
98}
99
100void report_log_system_panic(void)
101{
102/* default support trigger ap reset */
103#ifndef NOT_TRIGGER_AP_RESET
104	panic("TEEOS panic\n");
105#endif
106}
107
108void ta_crash_report_log(void)
109{
110}
111
112int *map_log_mem(uint64_t mem_addr, uint32_t mem_len)
113{
114	(void)mem_len;
115	return (int *)(uintptr_t)mem_addr;
116}
117
118void unmap_log_mem(int *log_buffer)
119{
120	free_log_mem((uint64_t)(uintptr_t)log_buffer);
121}
122
123void get_log_chown(uid_t *user, gid_t *group)
124{
125	if (!user || !group) {
126		tloge("user or group buffer is null\n");
127		return;
128	}
129
130	*user = ROOT_UID;
131	*group = FILE_CHOWN_GID;
132}
133