Skip to content

Commit 9f7ab79

Browse files
committed
deal with data endianess with mem.endian and mapper/Memory features
rather than relying on a global exp._endian flag.
1 parent 55f285e commit 9f7ab79

File tree

14 files changed

+180
-138
lines changed

14 files changed

+180
-138
lines changed

amoco/arch/arm/cpu_armv7.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323

2424
mode = (lambda : internals['isetstate'])
25-
endian = (lambda : 1 if internals['endianstate']==0 else -1)
25+
endian = (lambda : 1 if internals['ibigend']==0 else -1)
2626

2727
disassemble = disassembler([spec_armv7,spec_thumb],instruction_armv7,mode,endian)
2828

amoco/arch/arm/cpu_armv8.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
instruction_armv8.set_formatter(ARM_V8_full)
2020

21-
endian = (lambda : 1 if internals['endianstate']==0 else -1)
21+
endian = (lambda : 1 if internals['ibigend']==0 else -1)
2222

2323
disassemble = disassembler([spec_armv8],endian=endian,iclass=instruction_armv8)
2424

amoco/arch/arm/v7/asm.py

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ def __check_state(i,fmap):
3636
else:
3737
logger.verbose('impossible to check isetstate (ARM/Thumb) until pc is cst')
3838

39+
def __mem(a,sz):
40+
endian = 1
41+
if internals['endianstate']==1:
42+
endian = -1
43+
return mem(a,sz,endian=endian)
44+
3945
def __pre(i,fmap):
4046
fmap[pc] = fmap(pc+i.length)
4147
cond = fmap(CONDITION[i.cond][1])
@@ -562,7 +568,7 @@ def i_LDR(i,fmap):
562568
cond,dest,src,sht = __pre(i,fmap)
563569
off_addr = (src+sht) if i.add else (src-sht)
564570
adr = off_addr if i.index else src
565-
result = fmap(mem(adr,32))
571+
result = fmap(__mem(adr,32))
566572
if i.wback:
567573
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
568574
fmap[dest] = tst(cond,result,fmap(dest))
@@ -571,7 +577,7 @@ def i_LDREX(i,fmap):
571577
cond,dest,src,imm = __pre(i,fmap)
572578
off_addr = (src+imm)
573579
adr = off_addr
574-
result = fmap(mem(adr,32))
580+
result = fmap(__mem(adr,32))
575581
fmap[dest] = tst(cond,result,fmap(dest))
576582
# exclusive monitor not supported
577583

@@ -596,7 +602,7 @@ def i_LDRH(i,fmap):
596602
cond,dest,src,sht = __pre(i,fmap)
597603
off_addr = (src+sht) if i.add else (src-sht)
598604
adr = off_addr if i.index else src
599-
result = fmap(mem(adr,16)).zeroextend(32)
605+
result = fmap(__mem(adr,16)).zeroextend(32)
600606
fmap[dest] = tst(cond,result,fmap(dest))
601607
if i.wback:
602608
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
@@ -605,7 +611,7 @@ def i_LDREXH(i,fmap):
605611
cond,dest,src,imm = __pre(i,fmap)
606612
off_addr = (src+imm)
607613
adr = off_addr
608-
result = fmap(mem(adr,16)).zeroextend(32)
614+
result = fmap(__mem(adr,16)).zeroextend(32)
609615
fmap[dest] = tst(cond,result,fmap(dest))
610616
# exclusive monitor not supported
611617

@@ -622,7 +628,7 @@ def i_LDRSH(i,fmap):
622628
cond,dest,src,sht = __pre(i,fmap)
623629
off_addr = (src+sht) if i.add else (src-sht)
624630
adr = off_addr if i.index else src
625-
result = fmap(mem(adr,16)).signextend(32)
631+
result = fmap(__mem(adr,16)).signextend(32)
626632
fmap[dest] = tst(cond,result,fmap(dest))
627633
if i.wback:
628634
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
@@ -634,8 +640,8 @@ def i_LDRD(i,fmap):
634640
if src is pc: src = src+i.length
635641
off_addr = (src+sht) if i.add else (src-sht)
636642
adr = off_addr if i.index else src
637-
res1 = fmap(mem(adr,32))
638-
res2 = fmap(mem(adr+4,32))
643+
res1 = fmap(__mem(adr,32))
644+
res2 = fmap(__mem(adr+4,32))
639645
fmap[dst1] = tst(cond,res1,fmap(dst1))
640646
fmap[dst2] = tst(cond,res2,fmap(dst2))
641647
if i.wback:
@@ -645,7 +651,7 @@ def i_LDRT(i,fmap):
645651
cond,dest,src,sht = __pre(i,fmap)
646652
off_addr = (src+sht) if i.add else (src-sht)
647653
adr = off_addr if i.postindex else src
648-
result = fmap(mem(adr,32))
654+
result = fmap(__mem(adr,32))
649655
if i.postindex:
650656
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
651657
fmap[dest] = tst(cond,result,fmap(dest))
@@ -663,7 +669,7 @@ def i_LDRHT(i,fmap):
663669
cond,dest,src,sht = __pre(i,fmap)
664670
off_addr = (src+sht) if i.add else (src-sht)
665671
adr = off_addr if i.postindex else src
666-
result = fmap(mem(adr,16)).zeroextend(32)
672+
result = fmap(__mem(adr,16)).zeroextend(32)
667673
if i.postindex:
668674
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
669675
fmap[dest] = tst(cond,result,fmap(dest))
@@ -681,7 +687,7 @@ def i_LDRSHT(i,fmap):
681687
cond,dest,src,sht = __pre(i,fmap)
682688
off_addr = (src+sht) if i.add else (src-sht)
683689
adr = off_addr if i.postindex else src
684-
result = fmap(mem(adr,16)).signextend(32)
690+
result = fmap(__mem(adr,16)).signextend(32)
685691
if i.postindex:
686692
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
687693
fmap[dest] = tst(cond,result,fmap(dest))
@@ -693,14 +699,14 @@ def i_STR(i,fmap):
693699
result = fmap(dest)
694700
if i.wback:
695701
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
696-
fmap[mem(adr,32)] = tst(cond,result,fmap(mem(adr,32)))
702+
fmap[__mem(adr,32)] = tst(cond,result,fmap(__mem(adr,32)))
697703

698704
def i_STREX(i,fmap):
699705
cond,dest,src,imm = __pre(i,fmap)
700706
off_addr = (src+imm)
701707
adr = off_addr
702708
result = fmap(dest)
703-
fmap[mem(adr,32)] = tst(cond,result,fmap(mem(adr,32)))
709+
fmap[__mem(adr,32)] = tst(cond,result,fmap(__mem(adr,32)))
704710
# exclusive monitor not supported
705711

706712
def i_STRB(i,fmap):
@@ -725,7 +731,7 @@ def i_STRH(i,fmap):
725731
off_addr = (src+sht) if i.add else (src-sht)
726732
adr = off_addr if i.index else src
727733
result = fmap(dest[0:16])
728-
fmap[mem(adr,16)] = tst(cond,result,fmap(mem(adr,16)))
734+
fmap[__mem(adr,16)] = tst(cond,result,fmap(__mem(adr,16)))
729735
if i.wback:
730736
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
731737

@@ -734,7 +740,7 @@ def i_STREXH(i,fmap):
734740
off_addr = (src+imm)
735741
adr = off_addr
736742
result = fmap(dest[0:16])
737-
fmap[mem(adr,16)] = tst(cond,result,fmap(mem(adr,16)))
743+
fmap[__mem(adr,16)] = tst(cond,result,fmap(__mem(adr,16)))
738744
# exclusive monitor not supported
739745

740746
def i_STRD(i,fmap):
@@ -744,8 +750,8 @@ def i_STRD(i,fmap):
744750
if src is pc: src = src+i.length
745751
off_addr = (src+sht) if i.add else (src-sht)
746752
adr = off_addr if i.index else src
747-
adr1 = mem(adr,32)
748-
adr2 = mem(adr+4,32)
753+
adr1 = __mem(adr,32)
754+
adr2 = __mem(adr+4,32)
749755
res1 = fmap(dst1)
750756
res2 = fmap(dst2)
751757
fmap[adr1] = tst(cond,res1,fmap(adr1))
@@ -757,7 +763,7 @@ def i_STRT(i,fmap):
757763
cond,dest,src,sht = __pre(i,fmap)
758764
off_addr = (src+sht) if i.add else (src-sht)
759765
adr = off_addr if i.postindex else src
760-
adr1 = mem(adr,32)
766+
adr1 = __mem(adr,32)
761767
result = fmap(dest)
762768
if i.postindex:
763769
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
@@ -777,7 +783,7 @@ def i_STRHT(i,fmap):
777783
cond,dest,src,sht = __pre(i,fmap)
778784
off_addr = (src+sht) if i.add else (src-sht)
779785
adr = off_addr if i.postindex else src
780-
adr1 = mem(adr,16)
786+
adr1 = __mem(adr,16)
781787
result = fmap(dest[0:16])
782788
if i.postindex:
783789
fmap[src] = tst(cond,fmap(off_addr),fmap(src))
@@ -795,7 +801,7 @@ def i_POP(i,fmap):
795801
regs = i.operands[0]
796802
adr = sp
797803
for _r in regs:
798-
fmap[_r] = fmap(tst(cond,mem(adr,32),_r))
804+
fmap[_r] = fmap(tst(cond,__mem(adr,32),_r))
799805
adr = adr+4
800806
fmap[sp] = fmap(tst(cond,sp+(4*len(regs)),sp))
801807

@@ -806,7 +812,7 @@ def i_PUSH(i,fmap):
806812
adr = sp-(4*len(regs))
807813
for _r in regs:
808814
if _r is pc: _r = _r+i.length
809-
fmap[mem(adr,32)] = fmap(tst(cond,_r,mem(adr,32)))
815+
fmap[__mem(adr,32)] = fmap(tst(cond,_r,__mem(adr,32)))
810816
adr = adr+4
811817
fmap[sp] = fmap(tst(cond,sp-(4*len(regs)),sp))
812818

@@ -866,8 +872,7 @@ def i_PLI(i,fmap):
866872
# change endianess
867873
def i_SETEND(i,fmap):
868874
fmap[pc] = fmap(pc+i.length)
869-
internals['endianstate'] = 1 if i.set_bigend else 0
870-
exp.setendian(-1 if i.set_bigend else +1)
875+
internals['endianstate'] = -1 if i.set_bigend else 1
871876

872877
# event hint
873878
def i_SEV(i,fmap):
@@ -881,8 +886,8 @@ def i_SVC(i,fmap):
881886
def i_SWP(i,fmap):
882887
fmap[pc] = fmap(pc+i.length)
883888
Rt,Rt2,Rn = i.operands
884-
data = fmap(mem(Rn,32))
885-
fmap[mem(Rn,32)] = fmap(Rt2)
889+
data = fmap(__mem(Rn,32))
890+
fmap[__mem(Rn,32)] = fmap(Rt2)
886891
fmap[Rt] = data
887892

888893
def i_SWPB(i,fmap):

amoco/arch/arm/v7/env.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
'isetstate' : 0, #0: ARM, 1: Thumb, 2: Jazelle, 3: ThumbEE
8787
'itstate' : 0, # thumb internal parameter (see IT instruction)
8888
'endianstate': 0, #0: LE, 1: BE
89+
'ibigend' : 0, # instruction endianess (0: LE, 1:BE)
8990
}
9091

9192
# SIMD and VFP (floating point) extensions:

amoco/arch/arm/v8/asm64.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
from .utils import *
1212
from amoco.cas.utils import *
1313

14+
def __mem(a,sz):
15+
endian = 1
16+
if internals['endianstate']==1:
17+
endian=-1
18+
return mem(a,sz,endian=endian)
19+
1420
def i_ADC(i,fmap):
1521
fmap[pc] = fmap[pc]+i.length
1622
op1,op2 = map(fmap,i.operands[1:])
@@ -276,7 +282,7 @@ def i_HVC(i,fmap):
276282

277283
def i_LDAR(i,fmap):
278284
fmap[pc] = fmap[pc]+i.length
279-
data = fmap(mem(i.n,i.datasize))
285+
data = fmap(__mem(i.n,i.datasize))
280286
if i.pair:
281287
if not i.excl: raise InstructionError(i)
282288
if i.elsize==32:
@@ -287,8 +293,8 @@ def i_LDAR(i,fmap):
287293
fmap[i.t] = data[i.elsize:i.datasize]
288294
fmap[i.t2] = data[0:i.elsize]
289295
else:
290-
fmap[i.t] = fmap(mem(i.n, 64))
291-
fmap[i.t2] = fmap(mem(i.n, 64, disp=8))
296+
fmap[i.t] = fmap(__mem(i.n, 64))
297+
fmap[i.t2] = fmap(__mem(i.n, 64, disp=8))
292298
else:
293299
fmap[i.t] = data.zeroextend(i.regsize)
294300

@@ -333,8 +339,8 @@ def i_LDP(i,fmap):
333339
fmap[pc] = fmap[pc]+i.length
334340
address = i.n
335341
if not i.postindex: address += i.offset
336-
data1 = mem(address,i.datasize)
337-
data2 = mem(address,i.datasize, disp=i.datasize/8)
342+
data1 = __mem(address,i.datasize)
343+
data2 = __mem(address,i.datasize, disp=i.datasize/8)
338344
fmap[i.t] = fmap(data1)
339345
fmap[i.t2] = fmap(data2)
340346
if i.wback:
@@ -347,8 +353,8 @@ def i_STP(i,fmap):
347353
if not i.postindex: address += i.offset
348354
data1 = fmap(i.t)
349355
data2 = fmap(i.t2)
350-
fmap[mem(address,i.datasize)] = data1
351-
fmap[mem(address,i.datasize,disp=i.datasize/8)] = data2
356+
fmap[__mem(address,i.datasize)] = data1
357+
fmap[__mem(address,i.datasize,disp=i.datasize/8)] = data2
352358
if i.wback:
353359
if i.postindex: address += i.offset
354360
fmap[i.n] = fmap(address)
@@ -360,8 +366,8 @@ def i_LDPSW(i,fmap):
360366
fmap[pc] = fmap[pc]+i.length
361367
address = i.n
362368
if not i.postindex: address += i.offset
363-
data1 = mem(address,i.datasize)
364-
data2 = mem(address,i.datasize, disp=i.datasize/8)
369+
data1 = __mem(address,i.datasize)
370+
data2 = __mem(address,i.datasize, disp=i.datasize/8)
365371
fmap[i.t] = fmap(data1).signextend(64)
366372
fmap[i.t2] = fmap(data2).signextend(64)
367373
if i.wback:
@@ -374,7 +380,7 @@ def i_LDR(i,fmap):
374380
Xt, Xn, offset = i.operands
375381
address = Xn
376382
if not i.postindex: address += offset
377-
data = mem(address,i.datasize)
383+
data = __mem(address,i.datasize)
378384
if i.signed:
379385
fmap[Xt] = data.signextend(i.regsize)
380386
else:
@@ -386,7 +392,7 @@ def i_LDR(i,fmap):
386392
Xt, offset = i.operands
387393
address = fmap[pc] + offset
388394
fmap[pc] = fmap[pc]+i.length
389-
data = mem(address,i.size)
395+
data = __mem(address,i.size)
390396
if i.signed:
391397
fmap[Xt] = fmap(data.signextend(64))
392398
else:
@@ -542,7 +548,7 @@ def i_STR(i,fmap):
542548
Xt, Xn, offset = i.operands
543549
address = Xn
544550
if not i.postindex: address += offset
545-
dst = mem(address,i.datasize)
551+
dst = __mem(address,i.datasize)
546552
data = fmap(Xt)
547553
fmap[dst] = data[0:i.datasize]
548554
if i.wback:

amoco/arch/arm/v8/env64.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@
151151
#-----------------------------------------------------
152152
internals = { # states MUST be in a mutable object !
153153
'endianstate': 0, # 0: little-endian, 1: big-endian
154+
'ibigend' : 0 # instruction endianess: 0:LE, 1:BE
154155
}
155156

156157
# SIMD and VFP (floating point) extensions:

0 commit comments

Comments
 (0)