@@ -1379,12 +1379,8 @@ static int esil_deceq(RAnalEsil *esil) {
1379
1379
static int esil_poke_n (RAnalEsil * esil , int bits ) {
1380
1380
ut64 bitmask = genmask (bits - 1 );
1381
1381
ut64 num , addr ;
1382
- union {
1383
- ut8 byte ;
1384
- ut16 word ;
1385
- ut32 dword ;
1386
- ut64 qword ;
1387
- } n , n2 ;
1382
+ ut8 b [sizeof (ut64 )];
1383
+ ut64 n ;
1388
1384
char * dst = r_anal_esil_pop (esil );
1389
1385
char * src = r_anal_esil_pop (esil );
1390
1386
int bytes = bits / 8 , ret = 0 ;
@@ -1398,16 +1394,15 @@ static int esil_poke_n(RAnalEsil *esil, int bits) {
1398
1394
if (dst && r_anal_esil_get_parm (esil , dst , & addr )) {
1399
1395
int type = r_anal_esil_get_parm_type (esil , src );
1400
1396
if (type != R_ANAL_ESIL_PARM_INTERNAL ) {
1401
- n .qword = n2 .qword = 0 ;
1402
- r_anal_esil_mem_read (esil , addr , (ut8 * )& n , bytes );
1403
- r_mem_copyendian ((ut8 * )& n2 , (ut8 * )& n , bytes , !esil -> anal -> big_endian );
1404
- esil -> old = n2 .qword ;
1397
+ r_anal_esil_mem_read (esil , addr , b , bytes );
1398
+ n = r_read_ble64 (b , esil -> anal -> big_endian );
1399
+ esil -> old = n ;
1405
1400
esil -> cur = (num & bitmask );
1406
1401
esil -> lastsz = bits ;
1407
1402
num = num & bitmask ;
1408
1403
}
1409
- r_mem_copyendian (( ut8 * ) & n , ( ut8 * ) & num , bytes , ! esil -> anal -> big_endian );
1410
- ret = r_anal_esil_mem_write (esil , addr , ( const ut8 * ) & n , bytes );
1404
+ r_write_ble64 ( b , num , esil -> anal -> big_endian );
1405
+ ret = r_anal_esil_mem_write (esil , addr , b , bytes );
1411
1406
}
1412
1407
}
1413
1408
free (src );
@@ -1433,30 +1428,31 @@ static int esil_poke(RAnalEsil *esil) {
1433
1428
1434
1429
static int esil_poke_some (RAnalEsil * esil ) {
1435
1430
int i , ret = 0 ;
1431
+ int regsize ;
1436
1432
ut64 ptr , regs ;
1437
1433
char * count , * dst = r_anal_esil_pop (esil );
1438
- if (dst ) {
1434
+ if (dst && r_anal_esil_get_parm_size (esil , dst , NULL , & regsize )) {
1435
+ ut8 bytes = regsize / 8 ;
1439
1436
// reg
1440
1437
isregornum (esil , dst , & ptr );
1441
1438
count = r_anal_esil_pop (esil );
1442
1439
if (count ) {
1443
1440
isregornum (esil , count , & regs );
1444
1441
if (regs > 0 ) {
1442
+ ut8 b [bytes ];
1445
1443
ut64 num64 ;
1446
- ut32 num32 ;
1447
1444
for (i = 0 ; i < regs ; i ++ ) {
1448
1445
char * foo = r_anal_esil_pop (esil );
1449
1446
isregornum (esil , foo , & num64 );
1450
1447
/* TODO: implement peek here */
1451
1448
// read from $dst
1452
- num32 = num64 ;
1453
- ret = r_anal_esil_mem_write (esil , ptr ,
1454
- (const ut8 * )& num32 , sizeof (num32 ));
1455
- if (ret != sizeof (num32 )) {
1449
+ r_write_ble64 (b , num64 , esil -> anal -> big_endian );
1450
+ ret = r_anal_esil_mem_write (esil , ptr , b , bytes );
1451
+ if (ret != bytes ) {
1456
1452
//eprintf ("Cannot write at 0x%08" PFMT64x "\n", ptr);
1457
1453
esil -> trap = 1 ;
1458
1454
}
1459
- ptr += 4 ;
1455
+ ptr += bytes ;
1460
1456
free (foo );
1461
1457
}
1462
1458
}
@@ -1481,9 +1477,11 @@ static int esil_peek_n(RAnalEsil *esil, int bits) {
1481
1477
return 0 ;
1482
1478
}
1483
1479
if (dst && isregornum (esil , dst , & addr )) {
1484
- ut64 a , b , bitmask = genmask (bits - 1 );
1485
- ret = r_anal_esil_mem_read (esil , addr , (ut8 * )& a , bytes );
1486
- r_mem_copyendian ((ut8 * )& b , (const ut8 * )& a , bytes , !esil -> anal -> big_endian );
1480
+ ut64 bitmask = genmask (bits - 1 );
1481
+ ut8 a [sizeof (ut64 )];
1482
+ ut64 b ;
1483
+ ret = r_anal_esil_mem_read (esil , addr , a , bytes );
1484
+ b = r_read_ble64 (a , esil -> anal -> big_endian );
1487
1485
snprintf (res , sizeof (res ), "0x%" PFMT64x , b & bitmask );
1488
1486
r_anal_esil_push (esil , res );
1489
1487
esil -> lastsz = bits ;
@@ -1521,20 +1519,21 @@ static int esil_peek_some(RAnalEsil *esil) {
1521
1519
isregornum (esil , count , & regs );
1522
1520
if (regs > 0 ) {
1523
1521
ut32 num32 ;
1522
+ ut8 a [sizeof (ut32 )];
1524
1523
for (i = 0 ; i < regs ; i ++ ) {
1525
1524
char * foo = r_anal_esil_pop (esil );
1526
1525
if (!foo ) {
1527
1526
ERR ("Cannot pop in peek" );
1528
1527
return 0 ;
1529
1528
}
1530
- ret = r_anal_esil_mem_read (esil , ptr ,
1531
- ( ut8 * ) & num32 , sizeof (num32 ));
1532
- if ( ret == sizeof ( num32 )) {
1529
+ ret = r_anal_esil_mem_read (esil , ptr , a , 4 );
1530
+ if ( ret == sizeof (ut32 )) {
1531
+ num32 = r_read_ble32 ( a , esil -> anal -> big_endian );
1533
1532
r_anal_esil_reg_write (esil , foo , num32 );
1534
1533
} else {
1535
1534
eprintf ("Cannot peek from 0x%08" PFMT64x "\n" , ptr );
1536
1535
}
1537
- ptr += 4 ;
1536
+ ptr += sizeof ( ut32 ) ;
1538
1537
free (foo );
1539
1538
}
1540
1539
}
0 commit comments