@@ -83,10 +83,14 @@ typedef struct RISCVMachine {
8383#define RTC_FREQ_DIV 16 /* arbitrary, relative to CPU freq to have a
8484 10 MHz frequency */
8585
86+ void set_timecmp (RISCVMachine * machine0 , uint64_t timecmp );
87+ void print_console (RISCVMachine * machine0 , const char * buf , int len );
88+
8689uint64_t ecall_addr = 0 ;
8790uint64_t rdtime_addr = 0 ;
8891uint64_t dcache_iall_addr = 0 ;
8992uint64_t sync_s_addr = 0 ;
93+ uint64_t real_time = 0 ;
9094
9195static uint64_t rtc_get_real_time (RISCVMachine * s )
9296{
@@ -1042,7 +1046,6 @@ static VirtMachine *riscv_machine_init(const VirtMachineParams *p)
10421046 if (p -> console ) {
10431047 //// Begin Test: Save the Console
10441048 const char * msg = "TinyEMU Emulator for Ox64 BL808 RISC-V SBC\r\n" ;
1045- void print_console (RISCVMachine * machine0 , const char * buf , int len );
10461049 print_console (s , msg , strlen (msg ));
10471050 //// End Test
10481051 vbus -> irq = & s -> plic_irq [irq_num ];
@@ -1131,6 +1134,7 @@ static VirtMachine *riscv_machine_init(const VirtMachineParams *p)
11311134 p -> cmdline ,
11321135 p -> files [VM_FILE_INITRD ].buf , p -> files [VM_FILE_INITRD ].len );
11331136
1137+ set_timecmp (s , 0 ); //// Init the System Timer
11341138 return (VirtMachine * )s ;
11351139}
11361140
@@ -1167,10 +1171,16 @@ static int riscv_machine_get_sleep_duration(VirtMachine *s1, int delay)
11671171 delay = 0 ;
11681172
11691173 //// Begin Test: Trigger the Supervisor-Mode Timer Interrupt
1170- static uint64_t t = 0 ;
1171- if (t ++ % 100 == 0 ) {
1172- riscv_cpu_set_mip (s , MIP_STIP );
1173- } ////
1174+ real_time = rtc_get_time (m );
1175+ if (!(riscv_cpu_get_mip (s ) & MIP_STIP )) {
1176+ const int64_t delay2 = m -> timecmp - rtc_get_time (m );
1177+ if (delay2 <= 0 ) {
1178+ static uint64_t t = 0 ;
1179+ if (t ++ % 100 == 0 ) {
1180+ riscv_cpu_set_mip (s , MIP_STIP );
1181+ }
1182+ }
1183+ }
11741184 //// End Test
11751185 return delay ;
11761186}
@@ -1216,7 +1226,17 @@ const VirtMachineClass riscv_machine_class = {
12161226 riscv_vm_send_key_event ,
12171227};
12181228
1219- //// Begin Test: Print to Console
1229+ //// Begin Test
1230+ // Set Timer
1231+ void set_timecmp (RISCVMachine * machine0 , uint64_t timecmp ) {
1232+ static RISCVMachine * machine = NULL ;
1233+ if (machine0 != NULL ) { machine = machine0 ; return ; }
1234+ if (machine == NULL ) { puts ("set_timecmp: machine is null" ); return ; }
1235+ machine -> timecmp = timecmp ;
1236+ printf ("set_timecmp: timecmp=%p\n" , timecmp );
1237+ }
1238+
1239+ // Print to Console
12201240void print_console (RISCVMachine * machine0 , const char * buf , int len ) {
12211241 static RISCVMachine * machine = NULL ;
12221242 if (machine0 != NULL ) { machine = machine0 ; }
0 commit comments