Skip to content
This repository has been archived by the owner on Jun 26, 2024. It is now read-only.

Commit

Permalink
modifying how works register mode
Browse files Browse the repository at this point in the history
  • Loading branch information
Luminosaa committed Dec 29, 2023
1 parent 64027e4 commit 62d6ac9
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 22 deletions.
Binary file removed Examples/clock
Binary file not shown.
Binary file removed Examples/fibonacci
Binary file not shown.
7 changes: 3 additions & 4 deletions registers.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ registers registers_create()

registers r = NULL;
r = (registers)malloc(sizeof(struct registers_data));
r->mode = USR;
r->reg = (register_data *)malloc(sizeof(register_data) * N_REGISTRES);
for (int i = 0; i < N_REGISTRES; i++)
{
Expand Down Expand Up @@ -129,7 +128,7 @@ uint8_t get_read_write_mode(uint8_t mode)

uint8_t registers_get_mode(registers r)
{
return r->mode;
return get_bits(r->reg[CPSR].data[0], 5, 0);
}

static int registers_mode_has_spsr(registers r, uint8_t mode)
Expand Down Expand Up @@ -160,7 +159,7 @@ uint32_t registers_read(registers r, uint8_t reg, uint8_t mode)

uint32_t registers_read_cpsr(registers r)
{
return registers_read(r, CPSR, r->mode);
return r->reg[CPSR].data[0];
}

uint32_t registers_read_spsr(registers r, uint8_t mode)
Expand All @@ -181,7 +180,7 @@ void registers_write(registers r, uint8_t reg, uint8_t mode, uint32_t value)

void registers_write_cpsr(registers r, uint32_t value)
{
registers_write(r, CPSR, 0, value);
r->reg[CPSR].data[0] = value;
return;
}

Expand Down
1 change: 0 additions & 1 deletion registers.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ typedef struct
*/
struct registers_data
{
uint8_t mode;
register_data *reg;
};

Expand Down
46 changes: 29 additions & 17 deletions registers_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
�tats-Unis.
Contact: Guillaume.Huard@imag.fr
B�timent IMAG
700 avenue centrale, domaine universitaire
38401 Saint Martin d'H�res
B�timent IMAG
700 avenue centrale, domaine universitaire
38401 Saint Martin d'H�res
*/
#include <stdio.h>
#include <stdlib.h>
Expand All @@ -28,55 +28,67 @@ Contact: Guillaume.Huard@imag.fr
#include "arm_constants.h"
#include "util.h"

int main() {
int main()
{
registers r;
uint32_t word_value[15], word_read;
int i;

r = registers_create();
if (r == NULL) {
if (r == NULL)
{
fprintf(stderr, "Error when creating simulated registers\n");
exit(1);
}
printf("Registers created\n");
srandom(getpid());
for (i = 0; i < 15; i++) {
for (i = 0; i < 15; i++)
{
word_value[i] = random();
}

// Arm reset
printf("Reseting registers...\n");
registers_write_cpsr(r, 0x1d3);
registers_write_cpsr(r, 0x110);

uint8_t mode = registers_get_mode(r);
printf("Testing read and write to general registers:\n");
for (i = 0; i < 15; i++) {
for (i = 0; i < 15; i++)
{
registers_write(r, i, mode, word_value[i]);
}
for (i = 0; i < 15; i++) {
for (i = 0; i < 15; i++)
{
word_read = registers_read(r, i, mode);
printf("- register %d : must have : %d and have %d (in mode %d) ", i, word_value[i], word_read, mode);
if (word_read != word_value[i]) return 1;
if (word_read != word_value[i])
return 1;
printf("Test passed\n");
}

printf("Current mode : ");
if (registers_get_mode(r) != USR) return 1;
if (registers_get_mode(r) != USR)
return 1;
printf("Test passed\n");
r->mode = IRQ;
registers_write_cpsr(r, 0x1d3);

printf("Mode is priviledged : ");
if (!registers_in_a_privileged_mode(r)) return 1;
if (!registers_in_a_privileged_mode(r))
return 1;
printf("Test passed\n");
printf("Mode has spsr : ");
if (!registers_current_mode_has_spsr(r)) return 1;
if (!registers_current_mode_has_spsr(r))
return 1;
printf("Test passed\n");

printf("Test if pointer have the same destination : ");
if (registers_read(r, 0, USR) != registers_read(r, 0, IRQ)) return 1;
if (registers_read(r, 0, USR) != registers_read(r, 0, IRQ))
return 1;
printf("Test passed\n");
printf("Test if pointer have differents destination : ");
registers_write(r, 14, USR, 0x10);
registers_write(r, 14, IRQ, 0x5);
if (registers_read(r, 14, USR) == registers_read(r, 14, IRQ)) return 1;
if (registers_read(r, 14, USR) == registers_read(r, 14, IRQ))
return 1;
printf("Test passed\n");

printf("Free registers...\n");
Expand Down

0 comments on commit 62d6ac9

Please sign in to comment.