From 18120f153d138f733fa7e8a89c3456bb93683f96 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Thu, 17 Jun 2021 20:01:32 +1000 Subject: [PATCH] MMU: Implement a vestigial partition table This implements a 1-entry partition table, so that instead of getting the process table base address from the PRTBL SPR, the MMU now reads the doubleword pointed to by the PTCR register plus 8 to get the process table base address. The partition table entry is cached. Having the PTCR and the vestigial partition table reduces the amount of software change required in Linux for Microwatt support. Signed-off-by: Paul Mackerras --- common.vhdl | 2 +- decode1.vhdl | 2 +- loadstore1.vhdl | 4 +-- mmu.vhdl | 48 ++++++++++++++++++++++++++------ tests/mmu/mmu.c | 9 ++++-- tests/modes/modes.c | 13 +++++---- tests/privileged/privileged.c | 9 ++++-- tests/reservation/reservation.c | 1 - tests/spr_read/spr_read.c | 4 +-- tests/test_mmu.bin | Bin 24600 -> 24608 bytes tests/test_modes.bin | Bin 20512 -> 20520 bytes tests/test_privileged.bin | Bin 16408 -> 16416 bytes tests/test_spr_read.bin | Bin 6344 -> 6344 bytes tests/test_spr_read.console_out | 2 +- 14 files changed, 67 insertions(+), 27 deletions(-) diff --git a/common.vhdl b/common.vhdl index 69dde30..b18a271 100644 --- a/common.vhdl +++ b/common.vhdl @@ -51,7 +51,7 @@ package common is constant SPR_HSPRG0 : spr_num_t := 304; constant SPR_HSPRG1 : spr_num_t := 305; constant SPR_PID : spr_num_t := 48; - constant SPR_PRTBL : spr_num_t := 720; + constant SPR_PTCR : spr_num_t := 464; constant SPR_PVR : spr_num_t := 287; -- GPR indices in the register file (GPR only) diff --git a/decode1.vhdl b/decode1.vhdl index 2869c39..5d0bdcb 100644 --- a/decode1.vhdl +++ b/decode1.vhdl @@ -609,7 +609,7 @@ begin vi.force_single := '1'; -- send MMU-related SPRs to loadstore1 case sprn is - when SPR_DAR | SPR_DSISR | SPR_PID | SPR_PRTBL => + when SPR_DAR | SPR_DSISR | SPR_PID | SPR_PTCR => vi.override_decode.unit := LDST; vi.override_unit := '1'; when others => diff --git a/loadstore1.vhdl b/loadstore1.vhdl index 3328617..822cc19 100644 --- a/loadstore1.vhdl +++ b/loadstore1.vhdl @@ -477,7 +477,7 @@ begin v.read_spr := '1'; when OP_MTSPR => v.write_spr := '1'; - v.mmu_op := sprn(9) or sprn(5); + v.mmu_op := sprn(8) or sprn(5); when OP_FETCH_FAILED => -- send it to the MMU to do the radix walk v.instr_fault := '1'; @@ -732,7 +732,7 @@ begin write_enable := '1'; -- partial decode on SPR number should be adequate given -- the restricted set that get sent down this path - if r2.req.sprn(9) = '0' and r2.req.sprn(5) = '0' then + if r2.req.sprn(8) = '0' and r2.req.sprn(5) = '0' then if r2.req.sprn(0) = '0' then sprval := x"00000000" & r3.dsisr; else diff --git a/mmu.vhdl b/mmu.vhdl index 623c2c9..d80caf4 100644 --- a/mmu.vhdl +++ b/mmu.vhdl @@ -29,6 +29,9 @@ architecture behave of mmu is type state_t is (IDLE, DO_TLBIE, TLB_WAIT, + PART_TBL_READ, + PART_TBL_WAIT, + PART_TBL_DONE, PROC_TBL_READ, PROC_TBL_WAIT, SEGMENT_CHECK, @@ -47,12 +50,14 @@ architecture behave of mmu is addr : std_ulogic_vector(63 downto 0); inval_all : std_ulogic; -- config SPRs - prtbl : std_ulogic_vector(63 downto 0); + ptcr : std_ulogic_vector(63 downto 0); pid : std_ulogic_vector(31 downto 0); -- internal state state : state_t; done : std_ulogic; err : std_ulogic; + prtbl : std_ulogic_vector(63 downto 0); + ptb_valid : std_ulogic; pgtbl0 : std_ulogic_vector(63 downto 0); pt0_valid : std_ulogic; pgtbl3 : std_ulogic_vector(63 downto 0); @@ -77,7 +82,7 @@ architecture behave of mmu is begin -- Multiplex internal SPR values back to loadstore1, selected -- by l_in.sprn. - l_out.sprval <= r.prtbl when l_in.sprn(9) = '1' else x"00000000" & r.pid; + l_out.sprval <= r.ptcr when l_in.sprn(8) = '1' else x"00000000" & r.pid; mmu_0: process(clk) begin @@ -85,9 +90,10 @@ begin if rst = '1' then r.state <= IDLE; r.valid <= '0'; + r.ptb_valid <= '0'; r.pt0_valid <= '0'; r.pt3_valid <= '0'; - r.prtbl <= (others => '0'); + r.ptcr <= (others => '0'); r.pid <= (others => '0'); else if rin.valid = '1' then @@ -185,6 +191,7 @@ begin variable tlb_load : std_ulogic; variable itlb_load : std_ulogic; variable tlbie_req : std_ulogic; + variable ptbl_rd : std_ulogic; variable prtbl_rd : std_ulogic; variable pt_valid : std_ulogic; variable effpid : std_ulogic_vector(31 downto 0); @@ -215,6 +222,7 @@ begin itlb_load := '0'; tlbie_req := '0'; v.inval_all := '0'; + ptbl_rd := '0'; prtbl_rd := '0'; -- Radix tree data structures in memory are big-endian, @@ -256,11 +264,15 @@ begin if l_in.sprn(3) = '1' then v.pt0_valid := '0'; v.pt3_valid := '0'; + v.ptb_valid := '0'; end if; v.state := DO_TLBIE; else v.valid := '1'; - if pt_valid = '0' then + if r.ptb_valid = '0' then + -- need to fetch process table base from partition table + v.state := PART_TBL_READ; + elsif pt_valid = '0' then -- need to fetch process table entry -- set v.shift so we can use finalmask for generating -- the process table entry address @@ -277,13 +289,14 @@ begin end if; if l_in.mtspr = '1' then -- Move to PID needs to invalidate L1 TLBs and cached - -- pgtbl0 value. Move to PRTBL does that plus - -- invalidating the cached pgtbl3 value as well. - if l_in.sprn(9) = '0' then + -- pgtbl0 value. Move to PTCR does that plus + -- invalidating the cached pgtbl3 and prtbl values as well. + if l_in.sprn(8) = '0' then v.pid := l_in.rs(31 downto 0); else - v.prtbl := l_in.rs; + v.ptcr := l_in.rs; v.pt3_valid := '0'; + v.ptb_valid := '0'; end if; v.pt0_valid := '0'; v.inval_all := '1'; @@ -300,6 +313,22 @@ begin v.state := RADIX_FINISH; end if; + when PART_TBL_READ => + dcreq := '1'; + ptbl_rd := '1'; + v.state := PART_TBL_WAIT; + + when PART_TBL_WAIT => + if d_in.done = '1' then + v.prtbl := data; + v.ptb_valid := '1'; + v.state := PART_TBL_DONE; + end if; + + when PART_TBL_DONE => + v.shift := unsigned('0' & r.prtbl(4 downto 0)); + v.state := PROC_TBL_READ; + when PROC_TBL_READ => dcreq := '1'; prtbl_rd := '1'; @@ -449,6 +478,9 @@ begin elsif tlb_load = '1' then addr := r.addr(63 downto 12) & x"000"; tlb_data := pte; + elsif ptbl_rd = '1' then + addr := x"00" & r.ptcr(55 downto 12) & x"008"; + tlb_data := (others => '0'); elsif prtbl_rd = '1' then addr := prtable_addr; tlb_data := (others => '0'); diff --git a/tests/mmu/mmu.c b/tests/mmu/mmu.c index ef00824..64afa44 100644 --- a/tests/mmu/mmu.c +++ b/tests/mmu/mmu.c @@ -24,7 +24,7 @@ static inline void do_tlbie(unsigned long rb, unsigned long rs) #define SRR0 26 #define SRR1 27 #define PID 48 -#define PRTBL 720 +#define PTCR 464 static inline unsigned long mfspr(int sprnum) { @@ -115,15 +115,18 @@ void zero_memory(void *ptr, unsigned long nbytes) */ unsigned long *pgdir = (unsigned long *) 0x10000; unsigned long *proc_tbl = (unsigned long *) 0x12000; -unsigned long free_ptr = 0x13000; +unsigned long *part_tbl = (unsigned long *) 0x13000; +unsigned long free_ptr = 0x14000; void *eas_mapped[4]; int neas_mapped; void init_mmu(void) { + /* set up partition table */ + store_pte(&part_tbl[1], (unsigned long)proc_tbl); /* set up process table */ zero_memory(proc_tbl, 512 * sizeof(unsigned long)); - mtspr(PRTBL, (unsigned long)proc_tbl); + mtspr(PTCR, (unsigned long)part_tbl); mtspr(PID, 1); zero_memory(pgdir, 1024 * sizeof(unsigned long)); /* RTS = 0 (2GB address space), RPDS = 10 (1024-entry top level) */ diff --git a/tests/modes/modes.c b/tests/modes/modes.c index c8ec9ce..b94bb47 100644 --- a/tests/modes/modes.c +++ b/tests/modes/modes.c @@ -33,7 +33,7 @@ static inline void do_tlbie(unsigned long rb, unsigned long rs) #define SPRG0 272 #define SPRG1 273 #define SPRG3 275 -#define PRTBL 720 +#define PTCR 464 static inline unsigned long mfspr(int sprnum) { @@ -121,15 +121,18 @@ void zero_memory(void *ptr, unsigned long nbytes) * Set up an MMU translation tree using memory starting at the 64k point. * We use 3 levels, mapping 512GB, with 4kB PGD/PMD/PTE pages. */ -unsigned long *proc_tbl = (unsigned long *) 0x10000; -unsigned long *pgdir = (unsigned long *) 0x11000; -unsigned long free_ptr = 0x12000; +unsigned long *part_tbl = (unsigned long *) 0x10000; +unsigned long *proc_tbl = (unsigned long *) 0x11000; +unsigned long *pgdir = (unsigned long *) 0x12000; +unsigned long free_ptr = 0x13000; void init_mmu(void) { + /* set up partition table */ + store_pte(&part_tbl[1], (unsigned long)proc_tbl); /* set up process table */ zero_memory(proc_tbl, 512 * sizeof(unsigned long)); - mtspr(PRTBL, (unsigned long)proc_tbl); + mtspr(PTCR, (unsigned long)part_tbl); mtspr(PID, 1); zero_memory(pgdir, 512 * sizeof(unsigned long)); /* RTS = 8 (512GB address space), RPDS = 9 (512-entry top level) */ diff --git a/tests/privileged/privileged.c b/tests/privileged/privileged.c index 68e30bc..fc6b23d 100644 --- a/tests/privileged/privileged.c +++ b/tests/privileged/privileged.c @@ -14,7 +14,7 @@ extern int call_with_msr(unsigned long arg, int (*fn)(unsigned long), unsigned l #define SRR0 26 #define SRR1 27 #define PID 48 -#define PRTBL 720 +#define PTCR 464 #define PVR 287 static inline unsigned long mfspr(int sprnum) @@ -106,15 +106,18 @@ void zero_memory(void *ptr, unsigned long nbytes) */ unsigned long *pgdir = (unsigned long *) 0x10000; unsigned long *proc_tbl = (unsigned long *) 0x12000; -unsigned long free_ptr = 0x13000; +unsigned long *part_tbl = (unsigned long *) 0x13000; +unsigned long free_ptr = 0x14000; void init_mmu(void) { + /* set up partition table */ + store_pte(&part_tbl[1], (unsigned long)proc_tbl); /* set up process table */ zero_memory(proc_tbl, 512 * sizeof(unsigned long)); /* RTS = 0 (2GB address space), RPDS = 10 (1024-entry top level) */ store_pte(&proc_tbl[2 * 1], (unsigned long) pgdir | 10); - mtspr(PRTBL, (unsigned long)proc_tbl); + mtspr(PTCR, (unsigned long)part_tbl); mtspr(PID, 1); zero_memory(pgdir, 1024 * sizeof(unsigned long)); } diff --git a/tests/reservation/reservation.c b/tests/reservation/reservation.c index 4df4511..a3d5a7a 100644 --- a/tests/reservation/reservation.c +++ b/tests/reservation/reservation.c @@ -18,7 +18,6 @@ extern unsigned long do_stqcx(unsigned long dst, unsigned long regs); #define PID 48 #define SPRG0 272 #define SPRG1 273 -#define PRTBL 720 static inline unsigned long mfspr(int sprnum) { diff --git a/tests/spr_read/spr_read.c b/tests/spr_read/spr_read.c index fa41154..6d2859e 100644 --- a/tests/spr_read/spr_read.c +++ b/tests/spr_read/spr_read.c @@ -38,7 +38,7 @@ void print_test(char *str) #define SPR_HSPRG0 304 #define SPR_HSPRG1 305 #define SPR_PID 48 -#define SPR_PRTBL 720 +#define SPR_PTCR 464 #define SPR_PVR 287 #define __stringify_1(x...) #x @@ -83,7 +83,7 @@ int main(void) DO_ONE(SPR_HSPRG0); DO_ONE(SPR_HSPRG1); DO_ONE(SPR_PID); - DO_ONE(SPR_PRTBL); + DO_ONE(SPR_PTCR); DO_ONE(SPR_PVR); puts(PASS); diff --git a/tests/test_mmu.bin b/tests/test_mmu.bin index 7f87578a8479b4001d9aec97edf42bde0e9eabd7..1ade44ee74b94b62ae2714ae7a476a7d6bf9ed58 100755 GIT binary patch delta 2943 zcma)8eN0=|6~Fgkz$QRU2oc6OHeU;05}40tjN#ef#KwS~2Gk^N8WWQ(S+p%#6UnT8 zETp90C@2jF~pXVF3NnN9ml%D(4BBAIO06N`F?P;@khC^q4HyancL zDsY*zK#DADGI4Y#oD2F)=R(_C0--6GtnhR) zdu#IiWA;=_xl5UnV@XTsni_Y^$T@3;ZGxC79a$t=iFeAfhjB(%i)@mZ{Azo^e;H<~GBlC99J)`|8sI^dj*6hE z&NCkPQ`ECKrXhKy&*Sl$$oyRu!z+#8sV<-yaH={RZq=mI(=c5996bl?)w}Swpr$sX zXkGSvmq_(m>aTw%E$shnBH*{dsTy6fU}HAkNo(mMKKMn=H|R$&SyM&}VY$Ye;r>$g zSTLyI~L)kvDj#bhBS$QG2P}@k~g4x<{l^nkj4TXhKs#M=oY&jI$ zSbFB(S3ndh*0pc-L}*9tT5R9(97fuB^;yfB~ ztSX{$9~3KCg$dFA_O(8x{c4}e&RBmWd&;p!RI!&5Eb=9wf}XQQAgdvNv!5H=6+h!+ zTh1!0~k-ALVV z)Lu}F%{U1Iz$?;$nP5F3_~;rIZ`a!VLl&&W<9c!YcG!PCF&upGezFB4}LL5dq4G~8pMW>q#hIDZ|R^+kaXhlZn z0oIlftu1SlPBWz@E_T^hVBV~UU{fYtg~290x;x%fhUb85>-yD=LW!P3mRQ9qeIRN# zdJcM=7Xr?U7MvF?I4=|(R5l-=U%>fhy{;{0g`FmwL~H`FS+E}>&AN<@a#4|uQ+&{@ z(~0--?a~nTn>)SN6Gws^?#m$~{+p2FG#EGbkxj>UOzyWco*zz`_3ony#KqbyVVz(3 z&RO4-KCnvC8&*OZ`pB9FXJwzAU>?{^MA@JZ_v9OwUZO;{7Q4g{>w2F;#A1X2vl>>M znVK^=JA#is>|KVm-MZf1P(B{0EFY;KIuTGND>nDV6*+PjXVu-&ICW_4@3M!@Am#z% zm80b`gR`i6FY&LvXSwLSOd>l=lW{7hpTUIet65wa3_NIuzzJV&W8}oeYHe_!v$_{2A(3abz*Kwj#dzLYQBOVJ+hB!(skr z45uMJ)*a@jV;HX}|GXc=jNx>|Um_ksY*J2~#QWdCKLlVhn^M>bO-Q-QNsU2|t5>su zsQcG62qW&_rc6kG!8X>?Wg;y-W6;%Nb&lcHd|O3Azwr{0t+@}>Jy^|_&9XQmSdyQ} z1cj&FjA6dTODDkWNvC7r^gIhgo(Xyd_O|Y#RnXIFMCog|z5$We5}FLlt-B8S7i3vN zr`abTzbp9t7-c_Wf@Y1KT;v>==#l`5c~6H})SiILRS-8QR-(;p28S?SPx@MtToc+w}mq_ zjq_lijV78%PBt}7-IZ*H>^9m;RugQa0V{Uht_db>(ruNMwl-3?U93wpUERK(`{ubr zbZbg7-20t-?z!i?=iGDN$uV|(j2+v{W=HnjE-5b$KMSHCN}Ic&-J>jq0dd$;76y@I zgzYdOC4nqh0fLN15%PrNc(inrrz*T*-aePHuR08>=)ba{xevtV9eH5b#0>A&l(BC> z@F?!`Ze%{Z;B~Mde(bGeCvj1klTDzvENkgV4g>)}uA)<-=Dd_nyNsP>Zof$O>ma{S zfPS$j^>A;m;}vC0_xJ{`d-@o7e8Wke@TZ$W5uw=^)1jX0w7U)~i<`TZvp7=Lf^vOo zHOOFB1-rWajvZL+x}Fyc>3WM@T|P7XercG2%Qu`+8s=VrOBJl7_f2!%itEdrY!vsD zJ5#KrzaHN#FHbxDAH9WZTk(2%39}+wRbF;Xt@pK)-xesEVUXs_cY68&(g(TTaat>C z`Y>`T*WgMbU}`EJ@a9BxT@{`Mxh4a~>VC*h3a(_W1H^85?DSOkU*4G7&mA5ohyS5Z zbx#||x_kg91#7>j>-1DqzOo?N%l89Zeel`EXpal}1>0m)wo2Xd`QOCd@ShdtNnPQq;VwjX> zz%W^)SP7@noaak#i#x1RMDf;|B{;TPWCxK|6tJV{si<4GL9nyPRaPh2rxn4c)H_W1?Yk9Yh_vj2TwZz-j;OE%AfGu`rS9IA6zq;Y({ zHh;c*iS34aDdv`buFh^^p6FnoqF-EVV`P-)vbC{WZo)yaz;^AQB%w-SCrLI=h;J}I zHc3tv!d=n|2lbA0a+}^;2hrx$r1$=1dIepvoA{pOSa$DXf+$r9F$r!}8`<{Y&yhx) zmR9EQ`WoB2v!h6CqFP*3Ow>b#jkvsifNnWj?_^hTqQ0*B@P$M+@Edahm7iDbyjM1#u`>OZe?>g*yv#E@pNNuQ_lhj4qLv6tO6J9_jEz9PSFhi z5}A?=Uqw>cNo&1y5wL0{s`#~TV7Z0(a2?E zBs*cqzOQgQT=sizmptL~4`?1X)_;(rTrd?TNw~`p?pF*V7+Yhfu%)eaMC1-lI7jVO z*9U6&cTekfO^BK}nedrSn((HHQwTqNQ4!#0v=jWQ!*3FtL^J(qp7Q*0x(SGzSK#l)F}e@p9glq1~DX9$meR}*fV z*iKm9rU}0@@gl-KJ(@6KVtUNN7MW<8IE!$MaFj5$PKrIG$OH84gD$Vj#ToU(0YT2C3XL!8j3_F8Otp%(Y_q00c zn{trmV|c!GB}>NJtp(DS+q!;)bopOC{buPmNivm22&75ymgQ|0$ShqX9oUcw(kD}? z5|q-?5(ZHCS6#n@p^#(6%b5`TWa{RPKmH+A;#OK|^#-lB(+F!#D|j@NOQ%Ld1*{OS z(f?7L3ptsJ+3QM}hJke}Sr6`^`A!_7c@VFybFy3b_jPXmE!^g$UEVgg<>4&8*!Dc# z?Y_2^tOJMIve+>^M{^CQN$ESt+8v#RbnfR#0OFjkze@ARs07k8p`LTepe3&BqWe-w rm(wzI-)3)F8Z$+r-A=lVsl=QsKS#^0?}yvfXL3uqD*rP_SA6_0$%PB4 diff --git a/tests/test_modes.bin b/tests/test_modes.bin index edbe0c85e906b1d2e51257604fa9ca1687263265..7e6b8f5d03126023a7ce4e75f157bd289d1e387c 100755 GIT binary patch delta 2453 zcma)7duUTv82@gYrs*q0Z84onZkiSo8|jUG-PqLJq)%H*<72FYjiq*?9TO^ANZF0O zW|gTpsGjvdH|vH)hXZB8gei0~#i4?QZaB~lwQkK+R>8WuTF<^Ox$&`owhN~@=XZYJ z<9z3Lz77uy$A*Q$h+sI?ce$(>K=gujnQDPppl?yPYJ!*|ASQxcKAq`^T0od&!yb|C zmn2~|J0~qH0C2dIv@lY-R0*k9SX?R<9DfmQS?qd!*$wvT(43i$Q3cCW{hu4<}_cuh6E>qN-`;RlAF4|^c znrG*DYpQhFdO1$ay;3^$5IbH`?(yi>xx_L$+#SfG0~vtV1&)Kl`bK5BxN-ifEN07>b_Q{KuXpOuBG4DV2VHSKe(FN8t6 zT_eG$9GRWy7a%O7u4cx#eWp_nl;jk7oomFXVs)vD@t}0ze+zBG49&V=3786%|?x2|uh_UXqaMe@S?^?l+YdX@ev@^^9a0Kn2=SmdO|u z7=xY(N0xC67i^{3fq{Sx%c*}!eo!j2o0 z8VF7GV>|0gw6!4}TZyjr>T_y!Cs{#_!&8A5>4##c8+IwNv3(KJ-AMZC=>2w36>xcH zI0WA{?u~@Ry=s0-7q)@kn%37zxikFMEd5%vqPVC9}b!5oD%9jxNl{GuT&Uh%YC*CE3OOKT3=1p0TcnTt!&6wCRo`8 zU%61ip7^#4#cXS>&Bl3JEhr{0aZFllQqy8HU@7)eHn+H)eN*dst6TSxc*EMLkGK~z zFGfI%$rAQhddGRUQ7$EuL9i5*{6jtSmeWzTk=vT2=nRKrY@{ zUf?7AI~4dr7+~Juw>X~;*4PK}7Ec&J{jwdRG*3Hk>NB81o?~on-GX_vV|k7$(LvT* z*M%N_u6x5kwP8~InG*3H=hzPc+RWm-z|K}P)ETiKf)j^~L&g1Zme;TpWl`B+%h+pzLGJWKAKVrUV&W8!8$LOD> z1rH02i3B<*{x8M=o#8aw-B|5fjI$}UIP;kEYhT}-h@@a**I%xsxBCK!ucK|;Ag?%#xcVVG%XOeu%k_-!XY-+w4m_h l-<;EV=_A%BI4;d{9{IY{ve0xelx36jU8)a#Vv3#o{RglX5Dx$V delta 2491 zcmaJ?e`r%z6h5y_(o}0nXUkgJ(O09G^am!^))$l5m)h9aSd72W!GzRIrh|cQ4ifgV z#;jus3U$XnCQNOaD{lBl#R|&CR*Muw2Nw2+GTp4xt(l6-bgOIi?wpqw)G>T;^X~oL zckcP_z2CVx)+hD#NxgB&b|P_Mfg@hIO#_H35USNmAstAB?MW-7Rf({nf|w>ljba07 z0{h%De%@@wUYDaGcu$0ZqV$%UlYw%lR>i?ISvFYq3>DauE(*Scw_J77T`Y0it;a-K z%>&tks(ZrAV1A{24oKS}*A8M+h|Y94#m$bJuv znMdy}+z$~xekZ$7;!m(%h4h+9@AOl`Ewv6atkAXJf0|YYS_d_7v}h)a?77b4ytPS) zEY-FOF()jO$Pfv#7$S#>;2=!Riqr-%(b!(*HqvpbB1%<2sUmo#vASXr@p+MXBOQt2 z;TefsToslqTI<<=J1a96S4eS#PeeGkjWdj_eNSH4My(eQEoyYnGop)_WwF<5D7&8`Bk5ZG}GxkR|=PZsYu-8vcKZ`16jG}Jp*jh4F$NQJ3(*Yp-5^id$ z#LvCf4ZW!muM38iNijafPGZYJ>V`Kyb+el+H#sJ1CIP;i=rl4prsbsi5~p1)h7j@b zrzWT4Q6{U-F|8(Z7FWsQLxNQ}>z{LC6|QTR%_}Lm3=_?(q=$IExmx-XGtD2ZI5?4= zCU^ce-LG~!^O&{{*r#0+R3RA%*|~biqc!B)Kn5aC%|~1zZnW4SrMU3a;yUR%jxVlT z@c8%aoB;OvUfsXhn0#J7#SQBItszhA^PpGB`j>sn{$1^{cO@CWSNvrUetV`nYtC5o4J`4r_+2}Nw}I>y zpZc}?+O!BeXjgdE6$W;mFqeUu4eS(QR?4d2KF=zDi7|IhE6-m@TI0HjYpCu6nHh%0 zZ*>zt+vnq0v81l;t6MLsn@KAyHKO@Mij3%uMzpcJT8PGc|Ea{q>uM=RnoZcZq;!_D zGsYL6?!p9~T{63&-@^WaXyksk=7N}hJ?=BGB{an@qtCbAQIx!Pze>m30&^V->{8#f z?1{(e${H3?f}OjnY%G0#T42IIR8A9?Gfy;$R`Hrt3_hC!dV@E~7b z#J1rc-vY^oXMBxP1K#z$M@QY|udcf<&gvD(6)HrYA5<&p8=tbK(i32t>&dAAIE+X9 z?v0y_`M6pkHSFUm9xWJ+yXea0YUav*G@i}*--`UdKONpdjdl~GP35?9X+(M*4=rsZ zp<_#HO1G}d8*wIT)fKeh+Ikt%osKrNv~)=8adnHmTcvZOve5suNb~K1e5-c)FA?Tl z;x!Ag*%u;CDm7<+KjCat-MG{r>Cb#1MV*O7bZ*Rx5HCsiKP@ww!#1$&TBg&EiZP_RN)!L5cuV1 zOJF9zT>5;K+Gp4ww3|&5z-c@moL}gop6P)QNAYp6(!7pFJy@~a?$@Yy`JoVdd0u)r zzL&7bBLfTSxsFIdJ=J<6ldkwQCYCRDbHqc6APu@KNvF-$HEX2zq2{5yE7g)n0AhNxh5cZeQ%w9t*LX3G~>g)l<7qSPujA@ZPA@ vqPV}kuI#`+LNLM)vs2WL;aK}@^YD}q@snM)eCwx?!dGR|%a6@?L-zeIyh=fL diff --git a/tests/test_privileged.bin b/tests/test_privileged.bin index d89b34d424e2c74ef0392d5f4e76085a134daec0..cd7f38345dde61267ec5704e0008c90d6e0c9dd2 100755 GIT binary patch literal 16416 zcmeHNVQ5>|6+TarE!jz24LtC0);uTLW_f~XP>NK?$&>74j@&kGoRMFJ=h|UQ$-t%g z@szw5y&7-C!?1L8ux?r0LMled$_5#9jDec6kU@W>(2hW})lD6+4f{-=Maux^3R%`G+@o{*g_de@kQYcN^@VS{s{x^&o1{-ImRrejfQ;3aiUGxdVn8vV z7*Gr-1{4E|0mXn~Krx^gPz-D`2Cj?Il{xXk%7S=xWm&wnQWhVrL`f_2_kz$ZLAL~X z0s5t4Fk-`I2{uct=X=(%%sTm9qWo=unZh(c^u_O1ie%aw>BcqF<~1AXz26vYtS<&m zZn$?bcpqJMud|WQVt--7JvB0RQz@G&1|l}|Cd9|R%-y@9tE^FBhGPlVz zTnxR~#J{y5b6$uczs)pPBdXn}QUf98d#%pX_G3|Tq_XFwuqY7iz@Dz$)5V^T-u+8q zPdNVF7HUasrx%PP6i;6Y?{e-6(c9(wy9$3v;0v{Wk?_6zvQHtN+1*NWy}v#-ma6#v zD%SpWZ@-4mh72B-=pzWkK2T=4oqKpSIg`V|EEK z8N)IB24&igV2w3$z|m+iMP#Il!A1MJFtTqv6$F+`e_G95I$xhVK$C08bHv@b*x_au zIrj+say`4BFq{tenFWfvDXV{nlkxU5J761?w()c;?vf0Wni zF7vrid4~9zDWirmAe6&hR}+pUioKq`D~8G^P9Odq;;?qj+SWJ!WZ!(vwtAN14pBTY z0N&V^VA>Z9zHNCR-+nWW^{zdPyl$-2#NV{Gr$j;TV@|EkajcJz zR(h!zeAFq@9D3PIk#TG644DA6C&|FwojJC7!B^V z=fz|u0Qp9>u3vbTq;K$5@%t6@ptbUG;V9PRI}13kCJpZO-=fcDjcU%a1UTpVF)wWM zCTwEv&KJK7JVfXL?DG`vSyzJYGa2Ve_;OQeAHNFxmc&m1OH{^0)=?|w>g(t~?(x<4 z0YD7R%%-7Mz#G~xV8qV_~Ri|u&kE{4c{{Yf3qQ2e=1P-~)R7bNzu zY42$sJM8`6st3=gXM4M9Yp`tu=MmfAhW)iF*Kl1wj>J9U&{yN=S(I@cG`;s7;;oGV z=LN@W>}fuBm?$T0Zy(VeFJ9?>O$?QH2cP?E-ya|TglJD9iXP?OY{ZKCN z%I6)=8P;uuj_4aNv%M>HuLrndhQyGmVNKj_I} z*zkGo?PYj1;T-8ZFAEV#cjz^FV&9Ew=Hl zH(HI?_Y3_TYQg#d&O2}__QC|gZw70i@^9p5)HIuXjbcQOMWSHdZ4w9G9NZ)wh(ngHHYgR z*jboqAMDNtX0?4amVcL~#Csxj>iCZk9M`JterY?*o5ED){0Quh!_H+p3|>13>^iWY zGr;kj4-B>?XEj8Gwfmc~nvzgWz;3WCM2YPDV-R-za1TPbZp*MM!ET=I_Oz0 zb-WSA^>+Bq8~`hOH)^?SoOd;DfnER@{E72o266U0o{=hSXCkHvmmedcxe5ICz7@+A zE&~6yjvs)*Y>Ayn#LrCY1SXC=grs*6v|$s*%!4r9xeu@VXlu!~cYNwrxMqwkXpRJ$ zQEt$@=L6uHP%vs7dW26ODY>l$%e{+IOmf3lFxF0%T;U5~8n^lzJgM&gi2aq0F`8CR z2=SoOtexNGsr2Ns3Q}!>$7>%Ti?FFQQB`P9RmEGIpfJ>N#6-VDwLFtSHe!^wWjs+l z1!IBGEXFU__>*Vl2E|p`gVc_kU{NsQi#1-XjeK?d4zk_TCkt?}mN| z+pw+%kZl%AAH=fXlKOtZ-|@n7IVZ+a&(i2p-m+7>u8h9A((TA|mMzbnwObc0*M4@^ z?bu1(KGgJrU*oaSeCoI2=Gs2>_w)+E$F@PFLBhu zW>dQK7W*?5^DmvUvci9Jc84$@Q30Wm^ONsPp-($aTzCWV2w+85pZce8FKpM*_8RWX z@|UiPw*ESP8}WYv4Wj{W)bV?WpAS2L^uT^jZQm|B^8{-*EQfE(Vb^xwlwN23d(yEs znh10d+JmcB0x0Pjm|*Aj4F9ifAKGH+)BXy7u!`MU<$S(tz4H>hJO^-JSL1D6i zc(Dm4JH@EHg6AA+6ZsjqKHShLQCY|(#;x8w_VnvuwCrNiBS4Rece}jd8|1~)+kDbZ zKpVo}`5^-CA4iD?73hYonxlY%xDw*;1F|T?;w87iSPm*?H@<$f7ef1oW*CQZ0sl6- zm<1BX6Dt4R4#1IhrxO06QjP62ZW1K1b0<+3bTQ5lN^3(aRiXyN!g|u)#Dr7N#JY zI{oH)Lj@+7v9Y-nT+GQrIb7A1;87QbBL8Ja`|ntA1un92Z8y8Er5cd~Mn3+0gv?xM VIit=@wfwRrmXQRCUwtLv`Y-7fvS|PS diff --git a/tests/test_spr_read.bin b/tests/test_spr_read.bin index 66a546a96cfa919818a5ed73f0cf4ab3f5a80d07..68f6cd8f1d40ad5c59a98ccb0b2b2ceeeb6f7472 100755 GIT binary patch delta 24 gcmX?Mc*1Z4r!ZsDW-j5?EG!|;K@6LBit{r90A