Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F133104857
D28226.id82654.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D28226.id82654.diff
View Options
Index: sys/riscv/include/sbi.h
===================================================================
--- sys/riscv/include/sbi.h
+++ sys/riscv/include/sbi.h
@@ -99,6 +99,15 @@
#define SBI_HSM_STATUS_START_PENDING 2
#define SBI_HSM_STATUS_STOP_PENDING 3
+/* System Reset (SRST) Extension */
+#define SBI_EXT_ID_SRST 0x53525354
+#define SBI_SRST_SYSTEM_RESET 0
+#define SBI_SRST_TYPE_SHUTDOWN 0
+#define SBI_SRST_TYPE_COLD_REBOOT 1
+#define SBI_SRST_TYPE_WARM_REBOOT 2
+#define SBI_SRST_REASON_NONE 0
+#define SBI_SRST_REASON_SYSTEM_FAILURE 1
+
/* Legacy Extensions */
#define SBI_SET_TIMER 0
#define SBI_CONSOLE_PUTCHAR 1
@@ -199,6 +208,16 @@
*/
int sbi_hsm_hart_status(u_long hart);
+/*
+ * Reset the system based on the following 'type' and 'reason' chosen from:
+ * - SBI_SRST_TYPE_SHUTDOWN
+ * - SBI_SRST_TYPE_COLD_REBOOT
+ * - SBI_SRST_TYPE_WARM_REBOOT
+ * - SBI_SRST_REASON_NONE
+ * - SBI_SRST_REASON_SYSTEM_FAILURE
+ */
+void sbi_system_reset(u_long reset_type, u_long reset_reason);
+
/* Legacy extension functions. */
static __inline void
sbi_console_putchar(int ch)
@@ -218,13 +237,6 @@
return (SBI_CALL0(SBI_CONSOLE_GETCHAR, 0).error);
}
-static __inline void
-sbi_shutdown(void)
-{
-
- (void)SBI_CALL0(SBI_SHUTDOWN, 0);
-}
-
void sbi_print_version(void);
void sbi_init(void);
Index: sys/riscv/riscv/sbi.c
===================================================================
--- sys/riscv/riscv/sbi.c
+++ sys/riscv/riscv/sbi.c
@@ -49,6 +49,7 @@
static bool has_time_extension = false;
static bool has_ipi_extension = false;
static bool has_rfnc_extension = false;
+static bool has_srst_extension = false;
static struct sbi_ret
sbi_get_spec_version(void)
@@ -90,7 +91,18 @@
sbi_shutdown_final(void *dummy __unused, int howto)
{
if ((howto & RB_POWEROFF) != 0)
- sbi_shutdown();
+ sbi_system_reset(SBI_SRST_TYPE_SHUTDOWN, SBI_SRST_REASON_NONE);
+}
+
+void
+sbi_system_reset(u_long reset_type, u_long reset_reason)
+{
+ /* Use the SRST extension, if available. */
+ if (has_srst_extension) {
+ (void)SBI_CALL2(SBI_EXT_ID_SRST, SBI_SRST_SYSTEM_RESET, reset_type,
+ reset_reason);
+ }
+ (void)SBI_CALL0(SBI_SHUTDOWN, 0);
}
void
@@ -273,6 +285,8 @@
has_ipi_extension = true;
if (sbi_probe_extension(SBI_EXT_ID_RFNC) != 0)
has_rfnc_extension = true;
+ if (sbi_probe_extension(SBI_EXT_ID_SRST) != 0)
+ has_srst_extension = true;
/*
* Probe for legacy extensions. We still rely on many of them to be
@@ -295,8 +309,8 @@
KASSERT(has_rfnc_extension ||
sbi_probe_extension(SBI_REMOTE_SFENCE_VMA_ASID) != 0,
("SBI doesn't implement sbi_remote_sfence_vma_asid()"));
- KASSERT(sbi_probe_extension(SBI_SHUTDOWN) != 0,
- ("SBI doesn't implement sbi_shutdown()"));
+ KASSERT(has_srst_extension || sbi_probe_extension(SBI_SHUTDOWN) != 0,
+ ("SBI doesn't implement sbi_shutdown() or sbi_system_reset()"));
}
static void
Index: sys/riscv/riscv/vm_machdep.c
===================================================================
--- sys/riscv/riscv/vm_machdep.c
+++ sys/riscv/riscv/vm_machdep.c
@@ -110,7 +110,7 @@
cpu_reset(void)
{
- sbi_shutdown();
+ sbi_system_reset(SBI_SRST_TYPE_COLD_REBOOT, SBI_SRST_REASON_NONE);
while(1);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Oct 24, 12:39 AM (17 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24109951
Default Alt Text
D28226.id82654.diff (3 KB)
Attached To
Mode
D28226: riscv: add SBI system reset extension
Attached
Detach File
Event Timeline
Log In to Comment