Skip to content

Commit 34b7543

Browse files
committed
smp: only write rvbar if needed
Signed-off-by: Yureka <[email protected]>
1 parent 627bb43 commit 34b7543

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

src/smp.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ static void smp_start_cpu(int index, int die, int cluster, int core, u64 impl, u
123123

124124
printf("Starting CPU %d (%d:%d:%d)... ", index, die, cluster, core);
125125

126+
u64 rvbar_value = read64(impl);
127+
bool rvbar_locked = rvbar_value & 1;
128+
bool write_rvbar = (rvbar_value & 0xfffffffff000) != (u64)_vectors_start;
129+
if (rvbar_locked && write_rvbar) {
130+
printf("RVBAR is locked and does not already contain start address:\n 0x%x != 0x%x\n", rvbar_value, (u64)_vectors_start);
131+
return;
132+
}
133+
126134
memset(&spin_table[index], 0, sizeof(struct spin_table));
127135

128136
target_cpu = index;
@@ -140,7 +148,9 @@ static void smp_start_cpu(int index, int die, int cluster, int core, u64 impl, u
140148

141149
sysop("dsb sy");
142150

143-
write64(impl, (u64)_vectors_start);
151+
if (write_rvbar) {
152+
write64(impl, (u64)_vectors_start);
153+
}
144154

145155
cpu_start_base += die * PMGR_DIE_OFFSET;
146156

0 commit comments

Comments
 (0)