forked from Mirrors/opensbi
		
	lib: sbi: Implement SBI debug trigger extension
This patch adds functions to register ecalls for debug triggers and handler to handle the debug trigger function IDs. Signed-off-by: Himanshu Chauhan <hchauhan@ventanamicro.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
		
				
					committed by
					
						
						Anup Patel
					
				
			
			
				
	
			
			
			
						parent
						
							fa87ec90a0
						
					
				
				
					commit
					76a2a15c40
				
			@@ -46,4 +46,8 @@ config SBI_ECALL_VENDOR
 | 
			
		||||
	bool "Platform-defined vendor extensions"
 | 
			
		||||
	default y
 | 
			
		||||
 | 
			
		||||
config SBI_ECALL_DBTR
 | 
			
		||||
	bool "Debug Trigger Extension"
 | 
			
		||||
	default y
 | 
			
		||||
 | 
			
		||||
endmenu
 | 
			
		||||
 
 | 
			
		||||
@@ -52,6 +52,9 @@ libsbi-objs-$(CONFIG_SBI_ECALL_LEGACY) += sbi_ecall_legacy.o
 | 
			
		||||
carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_VENDOR) += ecall_vendor
 | 
			
		||||
libsbi-objs-$(CONFIG_SBI_ECALL_VENDOR) += sbi_ecall_vendor.o
 | 
			
		||||
 | 
			
		||||
carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_DBTR) += ecall_dbtr
 | 
			
		||||
libsbi-objs-$(CONFIG_SBI_ECALL_DBTR) += sbi_ecall_dbtr.o
 | 
			
		||||
 | 
			
		||||
libsbi-objs-y += sbi_bitmap.o
 | 
			
		||||
libsbi-objs-y += sbi_bitops.o
 | 
			
		||||
libsbi-objs-y += sbi_console.o
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										73
									
								
								lib/sbi/sbi_ecall_dbtr.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								lib/sbi/sbi_ecall_dbtr.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
/*
 | 
			
		||||
 * SPDX-License-Identifier: BSD-2-Clause
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2023 Ventana Micro Systems Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * Author(s):
 | 
			
		||||
 *   Himanshu Chauhan <hchauhan@ventanamicro.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <sbi/sbi_ecall.h>
 | 
			
		||||
#include <sbi/sbi_ecall_interface.h>
 | 
			
		||||
#include <sbi/sbi_error.h>
 | 
			
		||||
#include <sbi/sbi_trap.h>
 | 
			
		||||
#include <sbi/sbi_domain.h>
 | 
			
		||||
#include <sbi/sbi_dbtr.h>
 | 
			
		||||
 | 
			
		||||
static int sbi_ecall_dbtr_handler(unsigned long extid, unsigned long funcid,
 | 
			
		||||
				  struct sbi_trap_regs *regs,
 | 
			
		||||
				  struct sbi_ecall_return *out)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long smode = (csr_read(CSR_MSTATUS) & MSTATUS_MPP) >>
 | 
			
		||||
			MSTATUS_MPP_SHIFT;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
 | 
			
		||||
	switch (funcid) {
 | 
			
		||||
	case SBI_EXT_DBTR_NUM_TRIGGERS:
 | 
			
		||||
		ret = sbi_dbtr_num_trig(regs->a0, &out->value);
 | 
			
		||||
		break;
 | 
			
		||||
	case SBI_EXT_DBTR_SETUP_SHMEM:
 | 
			
		||||
		ret = sbi_dbtr_setup_shmem(sbi_domain_thishart_ptr(), smode,
 | 
			
		||||
					   regs->a0, regs->a1);
 | 
			
		||||
		break;
 | 
			
		||||
	case SBI_EXT_DBTR_TRIGGER_READ:
 | 
			
		||||
		ret = sbi_dbtr_read_trig(smode, regs->a0, regs->a1);
 | 
			
		||||
		break;
 | 
			
		||||
	case SBI_EXT_DBTR_TRIGGER_INSTALL:
 | 
			
		||||
		ret = sbi_dbtr_install_trig(smode, regs->a0, &out->value);
 | 
			
		||||
		break;
 | 
			
		||||
	case SBI_EXT_DBTR_TRIGGER_UNINSTALL:
 | 
			
		||||
		ret = sbi_dbtr_uninstall_trig(regs->a0, regs->a1);
 | 
			
		||||
		break;
 | 
			
		||||
	case SBI_EXT_DBTR_TRIGGER_ENABLE:
 | 
			
		||||
		ret = sbi_dbtr_enable_trig(regs->a0, regs->a1);
 | 
			
		||||
		break;
 | 
			
		||||
	case SBI_EXT_DBTR_TRIGGER_UPDATE:
 | 
			
		||||
		ret = sbi_dbtr_update_trig(smode, regs->a0, regs->a1);
 | 
			
		||||
		break;
 | 
			
		||||
	case SBI_EXT_DBTR_TRIGGER_DISABLE:
 | 
			
		||||
		ret = sbi_dbtr_disable_trig(regs->a0, regs->a1);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		ret = SBI_ENOTSUPP;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct sbi_ecall_extension ecall_dbtr;
 | 
			
		||||
 | 
			
		||||
static int sbi_ecall_dbtr_register_extensions(void)
 | 
			
		||||
{
 | 
			
		||||
	if (sbi_dbtr_get_total_triggers() == 0)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	return sbi_ecall_register_extension(&ecall_dbtr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct sbi_ecall_extension ecall_dbtr = {
 | 
			
		||||
	.extid_start = SBI_EXT_DBTR,
 | 
			
		||||
	.extid_end = SBI_EXT_DBTR,
 | 
			
		||||
	.handle = sbi_ecall_dbtr_handler,
 | 
			
		||||
	.register_extensions = sbi_ecall_dbtr_register_extensions,
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user