// SPDX-License-Identifier: GPL-2.0+ /* Copyright (C) 2022 AVM GmbH */ #define pr_fmt(fmt) "mrpc/avm_crashlog_server: " fmt #include "avm_crashlog_mrpc.h" #include #include #include #include #include #ifdef CONFIG_TFFS_REMOTE_CRASHLOG_WRITER static int crashlog_server_sem_down(void *arg, ssize_t arglen, void *rep, ssize_t replen) { down(&tffs_log_sema); return 0; } static int crashlog_server_sem_up(void *arg, ssize_t arglen, void *rep, ssize_t replen) { up(&tffs_log_sema); return 0; } #endif /* CONFIG_TFFS_REMOTE_CRASHLOG_WRITER */ #ifdef CONFIG_TFFS_REMOTE_CRASHLOG_READER static int crashlog_server_is_read_forbidden(void *arg, ssize_t arglen, void *rep, ssize_t replen) { int forbidden, *ret = rep; down(&tffs_log_sema); forbidden = AVM_WATCHDOG_Crashlog_read_forbidden(); *ret = cpu_to_be32(forbidden); pr_devel("[%s] forbidden=%d\n", __func__, forbidden); up(&tffs_log_sema); return 0; } #endif /* CONFIG_TFFS_REMOTE_CRASHLOG_READER */ static struct mrpc_procinfo crashlog_server_procs[] = { /* request, handle function, arg length, reply length */ #ifdef CONFIG_TFFS_REMOTE_CRASHLOG_WRITER MRPC_PROCINFO_ENTRY(MRPC_AVM_CRASHLOG_PROC_SEM_DOWN, crashlog_server_sem_down, 0, 0), MRPC_PROCINFO_ENTRY(MRPC_AVM_CRASHLOG_PROC_SEM_UP, crashlog_server_sem_up, 0, 0), #endif #ifdef CONFIG_TFFS_REMOTE_CRASHLOG_READER MRPC_PROCINFO_ENTRY(MRPC_AVM_CRASHLOG_PROC_IS_READ_FORBIDDEN, crashlog_server_is_read_forbidden, 0, sizeof(int)), #endif }; static int crashlog_server_init(void) { struct mrpc_server *server; server = mrpc_server_register( MRPC_RESERVED_ID_AVM_CRASHLOG, "AVM crashlog server", crashlog_server_procs, ARRAY_SIZE(crashlog_server_procs)); if (!server) return -ENODEV; return 0; } static_notifier_module_init(mrpc_ready, crashlog_server_init);