Make CPU code thread safe

master
vhaudiquet 12 months ago
parent afc68c1c96
commit c878dee7e0
  1. 2
      Makefile
  2. 8
      src/cpu/rv32cpu.c
  3. 2
      src/cpu/rv32cpu.h
  4. 12
      src/gdbstub/gdbstub.c

@ -1,7 +1,7 @@
NAME=vriscv
CC=gcc
CFLAGS=-O3 -Wall -I src
LDFLAGS=
LDFLAGS=-lpthread
BUILD_DIR=build
C_FILES := $(shell find src/ -name '*.c')

@ -9,6 +9,7 @@
#include <stdio.h>
rv32_cpu_t* cpu0;
pthread_mutex_t* cpu0_mutex;
typedef union RAW_INSTRUCTION
{
@ -40,6 +41,7 @@ static void cpu_print_instruction(instruction_t* instruction);
void cpu_init()
{
cpu0 = calloc(1, sizeof(rv32_cpu_t));
pthread_mutex_init(cpu0_mutex, 0);
cpu0->regs.zero = 0;
}
@ -645,6 +647,9 @@ void cpu_loop(rv32_cpu_t* cpu)
{
while(1)
{
// Aquire CPU mutex
pthread_mutex_lock(cpu0_mutex);
// Fetch
raw_instruction_t raw_instruction;
if(cpu->pc > memory_size - 4)
@ -668,6 +673,9 @@ void cpu_loop(rv32_cpu_t* cpu)
cpu->regs.zero = 0;
cpu->pc += 4;
// Let go of cpu mutex
pthread_mutex_unlock(cpu0_mutex);
}
}

@ -2,6 +2,7 @@
#define RV32CPU_H
#include <stdint.h>
#include <pthread.h>
/*
* This is a structure encoding for the registers of
@ -188,6 +189,7 @@ typedef struct RV32_CPU
} rv32_cpu_t;
extern rv32_cpu_t* cpu0;
extern pthread_mutex_t* cpu0_mutex;
void cpu_init();
void cpu_loop(rv32_cpu_t* cpu);

@ -183,6 +183,9 @@ void gdbstub_thread_gdb()
// g : read all registers -> send back all registers
char resp[32 * 8 + 8 + 1] = {0};
// Obtain CPU0 mutex
pthread_mutex_lock(cpu0_mutex);
// All general purpose registers in host byte order as chars
for(size_t i = 0; i < 32; i++)
{
@ -194,6 +197,9 @@ void gdbstub_thread_gdb()
uint32_t pc = htonl(cpu0->pc);
snprintf(resp + 32 * 8, 9, "%08x", pc);
// Let go of CPU0 mutex
pthread_mutex_unlock(cpu0_mutex);
// Final packet size, send packet
size_t size = 32 * 8 + 8;
gdbstub_send_packet(resp, size);
@ -202,6 +208,9 @@ void gdbstub_thread_gdb()
{
// G : write all registers -> read and set all registers
// Obtain CPU0 mutex
pthread_mutex_lock(cpu0_mutex);
// All general purpose registers in host byte order as chars
for(size_t i = 1; i < 32; i++)
{
@ -218,6 +227,9 @@ void gdbstub_thread_gdb()
pc = ntohl(pc);
cpu0->pc = pc;
// Let go of CPU0 Mutex
pthread_mutex_unlock(cpu0_mutex);
gdbstub_send_packet("OK", 2);
}
else if(packet[0] == 'm')

Loading…
Cancel
Save