Compare commits
3 commits
ee2ddd7e8c
...
0562c2fe5a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0562c2fe5a | ||
|
|
97c13200d2 | ||
|
|
265a388c93 |
4 changed files with 27 additions and 9 deletions
2
config.h
2
config.h
|
|
@ -2,7 +2,7 @@
|
||||||
* Number of CPU's For now, this is hard-coded here. It will likely be
|
* Number of CPU's For now, this is hard-coded here. It will likely be
|
||||||
* dynamically discovered in the future.
|
* dynamically discovered in the future.
|
||||||
*/
|
*/
|
||||||
#define NCPU 3
|
#define NCPU 4
|
||||||
|
|
||||||
/* Maximum number of files open */
|
/* Maximum number of files open */
|
||||||
#define NOFILE 10
|
#define NOFILE 10
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ void spin_unlock(spinlock_t *l) {
|
||||||
|
|
||||||
// Optional: tiny pause/backoff (works even if Zihintpause isn't present).
|
// Optional: tiny pause/backoff (works even if Zihintpause isn't present).
|
||||||
// See: https://github.com/riscv/riscv-isa-manual/blob/main/src/zihintpause.adoc
|
// See: https://github.com/riscv/riscv-isa-manual/blob/main/src/zihintpause.adoc
|
||||||
void cpu_relax(void) {
|
static inline void cpu_relax(void) {
|
||||||
#if defined(__riscv_zihintpause)
|
#if defined(__riscv_zihintpause)
|
||||||
__asm__ volatile("pause");
|
__asm__ volatile("pause");
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -8,5 +8,4 @@ typedef struct {
|
||||||
void spinlock_init(spinlock_t *l);
|
void spinlock_init(spinlock_t *l);
|
||||||
bool spin_trylock(spinlock_t *l);
|
bool spin_trylock(spinlock_t *l);
|
||||||
void spin_unlock(spinlock_t *l);
|
void spin_unlock(spinlock_t *l);
|
||||||
void cpu_relax(void);
|
|
||||||
void spin_lock(spinlock_t *l);
|
void spin_lock(spinlock_t *l);
|
||||||
|
|
|
||||||
25
start.c
25
start.c
|
|
@ -18,9 +18,14 @@ char stack0[4096 * NCPU] __attribute__((aligned(16)));
|
||||||
/* Keep this here and sync on it until we have synchronized printf */
|
/* Keep this here and sync on it until we have synchronized printf */
|
||||||
spinlock_t sl = {0};
|
spinlock_t sl = {0};
|
||||||
volatile int hold = 1;
|
volatile int hold = 1;
|
||||||
|
volatile int max_hart = 0;
|
||||||
|
|
||||||
/* This is where entry.S drops us of. All cores land here */
|
/* This is where entry.S drops us of. All cores land here */
|
||||||
void start() {
|
void start() {
|
||||||
|
// Do this first
|
||||||
|
__sync_fetch_and_add(&max_hart, 1);
|
||||||
|
__sync_synchronize();
|
||||||
|
|
||||||
u64 id = read_mhartid();
|
u64 id = read_mhartid();
|
||||||
|
|
||||||
// Keep each CPU's hartid in its tp (thread pointer) register, for cpuid().
|
// Keep each CPU's hartid in its tp (thread pointer) register, for cpuid().
|
||||||
|
|
@ -35,15 +40,29 @@ void start() {
|
||||||
uart_puts("Hello Neptune!\n");
|
uart_puts("Hello Neptune!\n");
|
||||||
spinlock_init(&sl);
|
spinlock_init(&sl);
|
||||||
hold = 0;
|
hold = 0;
|
||||||
|
} else {
|
||||||
|
while (hold);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (hold);
|
// spin_lock(&sl);
|
||||||
|
//
|
||||||
|
// uart_puts("Hart number: ");
|
||||||
|
// uart_putc(id + '0');
|
||||||
|
// uart_putc('\n');
|
||||||
|
//
|
||||||
|
// spin_unlock(&sl);
|
||||||
|
|
||||||
|
if (id == 0) {
|
||||||
spin_lock(&sl);
|
spin_lock(&sl);
|
||||||
uart_puts("Hart number: ");
|
uart_puts("Core count: ");
|
||||||
uart_putc(id + '0');
|
uart_putc(max_hart + '0');
|
||||||
uart_putc('\n');
|
uart_putc('\n');
|
||||||
|
if (max_hart == NCPU) {
|
||||||
|
uart_puts("All cores up!");
|
||||||
|
uart_putc('\n');
|
||||||
|
}
|
||||||
spin_unlock(&sl);
|
spin_unlock(&sl);
|
||||||
|
}
|
||||||
|
|
||||||
// We should not arrive here, but if we do, hang in a while on wfi.
|
// We should not arrive here, but if we do, hang in a while on wfi.
|
||||||
while (1) __asm__ volatile("wfi"); // (Wait For Interrupt)
|
while (1) __asm__ volatile("wfi"); // (Wait For Interrupt)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue