@@ -37,32 +37,46 @@ pub extern "C" fn rust_main(hartid: usize, dtb_pa: usize) -> ! {
37
37
let sbi_ret = sbi:: hart_get_status ( i) ;
38
38
println ! ( ">> Hart {} state return value: {:?}" , i, sbi_ret) ;
39
39
}
40
- } else if hartid == 1 || hartid == 2 {
40
+ } else if hartid == 1 {
41
41
let sbi_ret = sbi:: hart_suspend ( 0x00000000 , 0 , 0 ) ;
42
- println ! ( ">> Start test for hart {}, suspend return value {:?}" , hartid, sbi_ret) ;
42
+ println ! ( ">> Start test for hart {}, retentive suspend return value {:?}" , hartid, sbi_ret) ;
43
+ } else if hartid == 2 {
44
+ /* resume_addr should be physical address, and here pa == va */
45
+ let sbi_ret = sbi:: hart_suspend ( 0x80000000 , hart_2_resume as usize , 0x4567890a ) ;
46
+ println ! ( ">> Error for non-retentive suspend: {:?}" , sbi_ret) ;
47
+ loop { }
43
48
} else { // hartid == 3
44
49
loop { }
45
50
}
46
- if hartid == 0 || hartid == 1 {
51
+ if hartid == 0 {
47
52
println ! ( "<< Test-kernel: test for hart {} success, wake another hart" , hartid) ;
48
53
let bv: usize = 0b10 ;
49
54
let sbi_ret = sbi:: send_ipi ( & bv as * const _ as usize , hartid) ; // wake hartid + 1
50
- println ! ( ">> Wake, sbi return value {:?}" , sbi_ret) ;
55
+ println ! ( ">> Wake hart 1 , sbi return value {:?}" , sbi_ret) ;
51
56
loop { } // wait for machine shutdown
52
- } else if hartid == 2 {
53
- let param = 0x12345678 ;
54
- println ! ( ">> Start hart 3 with parameter {:#x}" , param) ;
55
- /* start_addr should be physical address, and here pa == va */
56
- let sbi_ret = sbi:: hart_start ( 3 , hart_3_start as usize , param) ;
57
- println ! ( ">> SBI return value: {:?}" , sbi_ret) ;
58
- loop { } // wait for machine shutdown
59
- } else { // hartid == 3
57
+ } else if hartid == 1 {
58
+ // send software IPI to activate hart 2
59
+ let bv: usize = 0b10 ;
60
+ let sbi_ret = sbi:: send_ipi ( & bv as * const _ as usize , hartid) ; // wake hartid + 1
61
+ println ! ( ">> Wake hart 2, sbi return value {:?}" , sbi_ret) ;
62
+ loop { }
63
+ } else { // hartid == 2 || hartid == 3
60
64
unreachable ! ( )
61
65
}
62
66
}
63
67
68
+ extern "C" fn hart_2_resume ( param : usize ) {
69
+ println ! ( "<< The parameter passed to hart 2 resume is: {:#x}" , param) ;
70
+ let param = 0x12345678 ;
71
+ println ! ( ">> Start hart 3 with parameter {:#x}" , param) ;
72
+ /* start_addr should be physical address, and here pa == va */
73
+ let sbi_ret = sbi:: hart_start ( 3 , hart_3_start as usize , param) ;
74
+ println ! ( ">> SBI return value: {:?}" , sbi_ret) ;
75
+ loop { } // wait for machine shutdown
76
+ }
77
+
64
78
extern "C" fn hart_3_start ( param : usize ) {
65
- println ! ( "<< The parameter passed to hart start is: {:#x}" , param) ;
79
+ println ! ( "<< The parameter passed to hart 3 start is: {:#x}" , param) ;
66
80
println ! ( "<< Test-kernel: All hart SBI test SUCCESS, shutdown" ) ;
67
81
sbi:: shutdown ( )
68
82
}
0 commit comments