From 62d6ac95f43d4d3088ef12b330d10d002813e574 Mon Sep 17 00:00:00 2001 From: Thomas Civade Date: Fri, 29 Dec 2023 12:09:25 +0100 Subject: [PATCH] modifying how works register mode --- Examples/clock | Bin 2544 -> 0 bytes Examples/fibonacci | Bin 2228 -> 0 bytes registers.c | 7 +++---- registers.h | 1 - registers_test.c | 46 ++++++++++++++++++++++++++++----------------- 5 files changed, 32 insertions(+), 22 deletions(-) delete mode 100755 Examples/clock delete mode 100755 Examples/fibonacci diff --git a/Examples/clock b/Examples/clock deleted file mode 100755 index 7e21f6ebbeb2e564efbfbc6243ba3416b09cc764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2544 zcma)7-ES0C6hC)9mMvShUy!x}bz({=4?D9hRRja}!%`|OG`59AAIj|RY&&shr_9ba zC6ZtQ>Wi3?7&Q@NO?)x&(HBj8F!5DG{0l6E1T_(T(!_`Lckb?8wh$9fd+zzZ_nb55 z-n}+8ds=9MnxN4Tcvj2=ZP`Y7X1nq0!`=E>_(D)@Y*7+Ne4t#oh zi|E0(W1ZVhZGiRnwrB?WeW1HRds^*x=k6r$ZDr~H&8+b&k#_%+ta0~xR*>Weu&lY-n^6Ky-B>i^{{*N!b9Y~z4b>LRFkw;t1(4h*T}$12G@3~omoJ# zPUr%$9_ zNF7hj^mK{t#8}^l6aAtGO->=88^;)Cpy<`|BHgFwu{X z+iGdiqe$vZKp{90B*Z;wz@RLm-b_|;eV2f07Qjk4ApNe(rn7>JJs>Uhh2vPqam*_S ziMu_ZiGR|2NB|%K1?5X&{&hPq{Y*h7_cFWBG@Y}iIIFi6&9q~hFPmtxq1z^=)(}Or z{Vh{CS`r(nkUqUlAjn~T0($InQXV<@+qkZVFQ(y zvl<4TQ>q4jIjp$OL^bljf``rMK= zIeg3-&e})qVQVBiGMs&WWYijpyprcuydzd7$oVT7uUzomGKBnE^`sjG$KpcZLoAj; zH_o^@|70aB#!$c}*ZeBGt&c*tVr7b9;K!L_T7b&47MVsh0_KJO?SML)~i2=Ss)Q)Rh6Qo^Dx9?$@XNH02#+pbc zZ)op{*&n~>i`lfvd2HCuG;Dj>0Wc37gY8urAyrQ-@(he3C&wUX6f%!p6CmUN5kP1T zJZmAhTpcOPf>Z?T{8Tgn@{T77a$C~~2J-I5

C;BMz_q37KQmo#K31Ry|{1e*WGC zGO)cva#&j8Hyb*(9|ZD#R(IY15O{v?sk1J#?eiA-6!>}ISi^r3y!;-J`TX-hepprf zYhX81BWp?I(wpM6F-fvS1G0KV0419EE} z%2s&HkLTtqpaSK$1_kqc9zcHy%kPq{FKlCcqd^;f#t7sYpaSK00~_M{DKI#0NJ*gV z$H4bO@n8+U7ngtvRG-7%g5Polej8iAZNdrkpTb7cl>A`C|F)cI%5{EPjO-eOzn_WN0DMDhB*_rRn_kQMi zX7`=hg)3a*tSu57g--)_plQZJJ1UdN(=a;9dRTWWz6`6i^mABJ6{7pOuGf;pm4EqWDn`7Aed!wy zkscru0Zy-10DMG&GvKO_gKv+sBhB{l)2OBv<&WJR?~oZy~}wo zKNme2k)y-WUfvgq4d6gJdwEEXUXDyeUWm+}q~WQ-PcuVEeuPCLFGb`q64Ln*>HJU! zNmZE~7L%nxY{Pq5ECdFpU9cOaN^;6SUT{H#HK>0j1Rz2DZT|uZ)A3J{(~|2RR z;swXHym-MiY%^YVP+g|$-_)_|vJI=mj^|3pn_kk!^zn;&ip|Z;T-HYYG3+vHXU%-x z%xlYzQ_QVnvY$nqa?n%B3;&%Ho5m%cH%uIxel&JkO)s;M6y{yLPwD4R@Bw*{KgG{b z=|j5FQccdJx1!xWghd@_@bj6da+hbKgEyl}<^gpbV^nt}emiBN;XBe@e*MAsK`;m% zduoJGPIQ#E08`nt1sMNF0?;l_8U+@$?UR68#}DQJKNfgxj8-}l#JhmnXHZ!4Phd(| zgOX4z=6iT_#Hlw(D1HX2LGyh9eir^0P?|__9r`U);1}Wg_tfG~1ApBSUxe?k@6YdS zt`Xx{tvEqFp?u0!57po@BX_H6d8o8i%e}=!ag|+EAHCkdG&d{{N2+Yvo{@$1+`z62 z&oehXrsvIUb#2uu6&&Fk*{o~cZX?$yt)Z7%#G+L)g^z`po^x#5#Ev?;Pd7ZzwX#+3 zi0^j=rTl+o7(}{D@n)viD}A4Yh`M+N1H=>ZH=NG|fEBTLhfnT(JT{<01dl!u!iVd> zU#A2KR@Bq0@H=^L0DscK6R{gDUNVSDzr)ra;Stw>l5O$iUHJ1*ArvFMSw7Yy3cect z_r8-y{+m$Zw?ugb&VoR&;{J%!(SyoIm^Ov62$Y(ccrhsTjSOvxO6OY<2v+RX3%`RG LItTp0qr86rWLZ=a diff --git a/registers.c b/registers.c index 2bfe71c..3cbcc94 100644 --- a/registers.c +++ b/registers.c @@ -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++) { @@ -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) @@ -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) @@ -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; } diff --git a/registers.h b/registers.h index 8a7c07d..4175a31 100644 --- a/registers.h +++ b/registers.h @@ -48,7 +48,6 @@ typedef struct */ struct registers_data { - uint8_t mode; register_data *reg; }; diff --git a/registers_test.c b/registers_test.c index 8c9a2fe..11d4a43 100644 --- a/registers_test.c +++ b/registers_test.c @@ -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 #include @@ -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");