Make CPU code thread safe
This commit is contained in:
		@@ -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')
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user