Skip to content

Commit 00b30b9

Browse files
committed
smp: only write rvbar if needed
Signed-off-by: Yureka <[email protected]>
1 parent 3a80f4c commit 00b30b9

1 file changed

Lines changed: 12 additions & 1 deletion

File tree

src/smp.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,15 @@ 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%lx != 0x%lx\n",
131+
rvbar_value, (u64)_vectors_start);
132+
return;
133+
}
134+
126135
memset(&spin_table[index], 0, sizeof(struct spin_table));
127136

128137
target_cpu = index;
@@ -140,7 +149,9 @@ static void smp_start_cpu(int index, int die, int cluster, int core, u64 impl, u
140149

141150
sysop("dsb sy");
142151

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

145156
cpu_start_base += die * PMGR_DIE_OFFSET;
146157

0 commit comments

Comments
 (0)