18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * defines common to all virtual CPUs 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2003 Fabrice Bellard 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This library is free software; you can redistribute it and/or 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * modify it under the terms of the GNU Lesser General Public 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * License as published by the Free Software Foundation; either 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * version 2 of the License, or (at your option) any later version. 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This library is distributed in the hope that it will be useful, 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Lesser General Public License for more details. 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * You should have received a copy of the GNU Lesser General Public 173266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner * License along with this library; if not, see <http://www.gnu.org/licenses/>. 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef CPU_ALL_H 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_ALL_H 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-common.h" 235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "cpu-common.h" 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* some important defines: 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * WORDS_ALIGNED : if defined, the host cpu can only make word aligned 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * memory accesses. 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 3020894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner * HOST_WORDS_BIGENDIAN : if defined, the host cpu is big endian and 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * otherwise little endian. 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (TARGET_WORDS_ALIGNED : same for target cpu (not supported yet)) 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * TARGET_WORDS_BIGENDIAN : same for target cpu 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "softfloat.h" 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4020894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define BSWAP_NEEDED 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef BSWAP_NEEDED 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline uint16_t tswap16(uint16_t s) 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return bswap16(s); 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline uint32_t tswap32(uint32_t s) 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return bswap32(s); 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline uint64_t tswap64(uint64_t s) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return bswap64(s); 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tswap16s(uint16_t *s) 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *s = bswap16(*s); 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tswap32s(uint32_t *s) 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *s = bswap32(*s); 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tswap64s(uint64_t *s) 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *s = bswap64(*s); 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline uint16_t tswap16(uint16_t s) 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return s; 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline uint32_t tswap32(uint32_t s) 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return s; 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline uint64_t tswap64(uint64_t s) 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return s; 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tswap16s(uint16_t *s) 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tswap32s(uint32_t *s) 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void tswap64s(uint64_t *s) 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if TARGET_LONG_SIZE == 4 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tswapl(s) tswap32(s) 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tswapls(s) tswap32s((uint32_t *)(s)) 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define bswaptls(s) bswap32s(s) 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tswapl(s) tswap64(s) 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define tswapls(s) tswap64s((uint64_t *)(s)) 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define bswaptls(s) bswap64s(s) 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef union { 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float32 f; 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t l; 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} CPU_FloatU; 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* NOTE: arm FPA is horrible as double 32 bit words are stored in big 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project endian ! */ 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef union { 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float64 d; 12620894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#if defined(HOST_WORDS_BIGENDIAN) \ 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project || (defined(__arm__) && !defined(__VFP_FP__) && !defined(CONFIG_SOFTFLOAT)) 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct { 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t upper; 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t lower; 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } l; 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct { 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t lower; 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t upper; 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } l; 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t ll; 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} CPU_DoubleU; 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef TARGET_SPARC 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef union { 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float128 q; 14420894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#if defined(HOST_WORDS_BIGENDIAN) \ 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project || (defined(__arm__) && !defined(__VFP_FP__) && !defined(CONFIG_SOFTFLOAT)) 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct { 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t upmost; 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t upper; 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t lower; 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t lowest; 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } l; 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct { 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t upper; 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t lower; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } ll; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct { 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t lowest; 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t lower; 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t upper; 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t upmost; 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } l; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct { 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t lower; 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint64_t upper; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } ll; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} CPU_QuadU; 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* CPU memory access without any memory or io remapping */ 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the generic syntax for the memory accesses is: 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * load: ld{type}{sign}{size}{endian}_{access_type}(ptr) 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * store: st{type}{size}{endian}_{access_type}(ptr, val) 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * type is: 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (empty): integer access 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * f : float access 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * sign is: 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (empty): for floats or 32 bit size 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * u : unsigned 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * s : signed 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * size is: 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * b: 8 bits 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * w: 16 bits 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * l: 32 bits 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * q: 64 bits 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * endian is: 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (empty): target cpu endianness or 8 bit access 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * r : reversed target cpu endianness (not implemented yet) 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * be : big endian (not implemented yet) 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * le : little endian (not implemented yet) 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * access_type is: 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * raw : host memory access 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * user : user mode access using soft MMU 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * kernel : kernel mode access using soft MMU 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldub_p(const void *ptr) 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(uint8_t *)ptr; 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldsb_p(const void *ptr) 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(int8_t *)ptr; 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stb_p(void *ptr, int v) 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint8_t *)ptr = v; 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kernel handles unaligned load/stores may give better results, but 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project it is a system wide setting : bad */ 22420894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#if defined(HOST_WORDS_BIGENDIAN) || defined(WORDS_ALIGNED) 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* conservative code for little endian unaligned accesses */ 2275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int lduw_le_p(const void *ptr) 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef _ARCH_PPC 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int val; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr)); 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return val; 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const uint8_t *p = ptr; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return p[0] | (p[1] << 8); 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldsw_le_p(const void *ptr) 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef _ARCH_PPC 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int val; 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr)); 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int16_t)val; 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const uint8_t *p = ptr; 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int16_t)(p[0] | (p[1] << 8)); 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldl_le_p(const void *ptr) 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef _ARCH_PPC 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int val; 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (ptr)); 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return val; 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const uint8_t *p = ptr; 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline uint64_t ldq_le_p(const void *ptr) 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const uint8_t *p = ptr; 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t v1, v2; 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v1 = ldl_le_p(p); 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project v2 = ldl_le_p(p + 4); 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return v1 | ((uint64_t)v2 << 32); 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stw_le_p(void *ptr, int v) 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef _ARCH_PPC 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr)); 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t *p = ptr; 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[0] = v; 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[1] = v >> 8; 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stl_le_p(void *ptr, int v) 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef _ARCH_PPC 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr)); 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t *p = ptr; 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[0] = v; 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[1] = v >> 8; 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[2] = v >> 16; 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p[3] = v >> 24; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stq_le_p(void *ptr, uint64_t v) 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t *p = ptr; 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_le_p(p, (uint32_t)v); 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_le_p(p + 4, v >> 32); 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* float access */ 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline float32 ldfl_le_p(const void *ptr) 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project union { 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float32 f; 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t i; 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } u; 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.i = ldl_le_p(ptr); 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return u.f; 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stfl_le_p(void *ptr, float32 v) 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project union { 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float32 f; 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t i; 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } u; 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = v; 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_le_p(ptr, u.i); 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline float64 ldfq_le_p(const void *ptr) 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CPU_DoubleU u; 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.l.lower = ldl_le_p(ptr); 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.l.upper = ldl_le_p(ptr + 4); 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return u.d; 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stfq_le_p(void *ptr, float64 v) 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CPU_DoubleU u; 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.d = v; 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_le_p(ptr, u.l.lower); 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_le_p(ptr + 4, u.l.upper); 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int lduw_le_p(const void *ptr) 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(uint16_t *)ptr; 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldsw_le_p(const void *ptr) 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(int16_t *)ptr; 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldl_le_p(const void *ptr) 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(uint32_t *)ptr; 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline uint64_t ldq_le_p(const void *ptr) 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(uint64_t *)ptr; 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stw_le_p(void *ptr, int v) 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint16_t *)ptr = v; 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stl_le_p(void *ptr, int v) 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint32_t *)ptr = v; 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stq_le_p(void *ptr, uint64_t v) 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint64_t *)ptr = v; 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* float access */ 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline float32 ldfl_le_p(const void *ptr) 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(float32 *)ptr; 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline float64 ldfq_le_p(const void *ptr) 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(float64 *)ptr; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stfl_le_p(void *ptr, float32 v) 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(float32 *)ptr = v; 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stfq_le_p(void *ptr, float64 v) 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(float64 *)ptr = v; 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 40120894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner#if !defined(HOST_WORDS_BIGENDIAN) || defined(WORDS_ALIGNED) 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int lduw_be_p(const void *ptr) 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__i386__) 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int val; 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm volatile ("movzwl %1, %0\n" 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "xchgb %b0, %h0\n" 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "=q" (val) 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "m" (*(uint16_t *)ptr)); 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return val; 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const uint8_t *b = ptr; 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ((b[0] << 8) | b[1]); 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldsw_be_p(const void *ptr) 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__i386__) 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int val; 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm volatile ("movzwl %1, %0\n" 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "xchgb %b0, %h0\n" 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "=q" (val) 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "m" (*(uint16_t *)ptr)); 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int16_t)val; 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const uint8_t *b = ptr; 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int16_t)((b[0] << 8) | b[1]); 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldl_be_p(const void *ptr) 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__i386__) || defined(__x86_64__) 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int val; 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm volatile ("movl %1, %0\n" 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "bswap %0\n" 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "=r" (val) 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "m" (*(uint32_t *)ptr)); 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return val; 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const uint8_t *b = ptr; 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline uint64_t ldq_be_p(const void *ptr) 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t a,b; 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project a = ldl_be_p(ptr); 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project b = ldl_be_p((uint8_t *)ptr + 4); 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (((uint64_t)a<<32)|b); 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stw_be_p(void *ptr, int v) 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__i386__) 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm volatile ("xchgb %b0, %h0\n" 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "movw %w0, %1\n" 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "=q" (v) 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "m" (*(uint16_t *)ptr), "0" (v)); 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t *d = (uint8_t *) ptr; 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[0] = v >> 8; 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[1] = v; 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stl_be_p(void *ptr, int v) 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(__i386__) || defined(__x86_64__) 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project asm volatile ("bswap %0\n" 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "movl %0, %1\n" 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "=r" (v) 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : "m" (*(uint32_t *)ptr), "0" (v)); 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t *d = (uint8_t *) ptr; 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[0] = v >> 24; 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[1] = v >> 16; 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[2] = v >> 8; 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project d[3] = v; 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stq_be_p(void *ptr, uint64_t v) 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_be_p(ptr, v >> 32); 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_be_p((uint8_t *)ptr + 4, v); 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* float access */ 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline float32 ldfl_be_p(const void *ptr) 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project union { 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float32 f; 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t i; 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } u; 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.i = ldl_be_p(ptr); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return u.f; 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stfl_be_p(void *ptr, float32 v) 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project union { 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project float32 f; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t i; 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } u; 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.f = v; 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_be_p(ptr, u.i); 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline float64 ldfq_be_p(const void *ptr) 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CPU_DoubleU u; 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.l.upper = ldl_be_p(ptr); 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.l.lower = ldl_be_p((uint8_t *)ptr + 4); 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return u.d; 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stfq_be_p(void *ptr, float64 v) 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CPU_DoubleU u; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project u.d = v; 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_be_p(ptr, u.l.upper); 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stl_be_p((uint8_t *)ptr + 4, u.l.lower); 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int lduw_be_p(const void *ptr) 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(uint16_t *)ptr; 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldsw_be_p(const void *ptr) 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(int16_t *)ptr; 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline int ldl_be_p(const void *ptr) 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(uint32_t *)ptr; 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline uint64_t ldq_be_p(const void *ptr) 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(uint64_t *)ptr; 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stw_be_p(void *ptr, int v) 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint16_t *)ptr = v; 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stl_be_p(void *ptr, int v) 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint32_t *)ptr = v; 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stq_be_p(void *ptr, uint64_t v) 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint64_t *)ptr = v; 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* float access */ 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline float32 ldfl_be_p(const void *ptr) 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(float32 *)ptr; 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline float64 ldfq_be_p(const void *ptr) 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *(float64 *)ptr; 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stfl_be_p(void *ptr, float32 v) 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(float32 *)ptr = v; 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void stfq_be_p(void *ptr, float64 v) 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(float64 *)ptr = v; 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* target CPU memory access functions */ 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_WORDS_BIGENDIAN) 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lduw_p(p) lduw_be_p(p) 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsw_p(p) ldsw_be_p(p) 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldl_p(p) ldl_be_p(p) 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldq_p(p) ldq_be_p(p) 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfl_p(p) ldfl_be_p(p) 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfq_p(p) ldfq_be_p(p) 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stw_p(p, v) stw_be_p(p, v) 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stl_p(p, v) stl_be_p(p, v) 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stq_p(p, v) stq_be_p(p, v) 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfl_p(p, v) stfl_be_p(p, v) 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfq_p(p, v) stfq_be_p(p, v) 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lduw_p(p) lduw_le_p(p) 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsw_p(p) ldsw_le_p(p) 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldl_p(p) ldl_le_p(p) 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldq_p(p) ldq_le_p(p) 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfl_p(p) ldfl_le_p(p) 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfq_p(p) ldfq_le_p(p) 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stw_p(p, v) stw_le_p(p, v) 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stl_p(p, v) stl_le_p(p, v) 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stq_p(p, v) stq_le_p(p, v) 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfl_p(p, v) stfl_le_p(p, v) 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfq_p(p, v) stfq_le_p(p, v) 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* MMU memory access macros */ 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_USER_ONLY) 6215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <assert.h> 6225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-types.h" 6235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* On some host systems the guest address space is reserved on the host. 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This allows the guest address space to be offset to a convenient location. 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 6273266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#if defined(CONFIG_USE_GUEST_BASE) 6283266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turnerextern unsigned long guest_base; 6293266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turnerextern int have_guest_base; 6305fbe340e4937c4df99b1064178076a85e341ca89David Turnerextern unsigned long reserved_va; 6313266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#define GUEST_BASE guest_base 6325fbe340e4937c4df99b1064178076a85e341ca89David Turner#define RESERVED_VA reserved_va 6333266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#else 6343266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#define GUEST_BASE 0ul 6355fbe340e4937c4df99b1064178076a85e341ca89David Turner#define RESERVED_VA 0ul 6363266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#endif 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* All direct uses of g2h and h2g need to go away for usermode softmmu. */ 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define g2h(x) ((void *)((unsigned long)(x) + GUEST_BASE)) 6405fbe340e4937c4df99b1064178076a85e341ca89David Turner 6415fbe340e4937c4df99b1064178076a85e341ca89David Turner#if HOST_LONG_BITS <= TARGET_VIRT_ADDR_SPACE_BITS 6425fbe340e4937c4df99b1064178076a85e341ca89David Turner#define h2g_valid(x) 1 6435fbe340e4937c4df99b1064178076a85e341ca89David Turner#else 6445fbe340e4937c4df99b1064178076a85e341ca89David Turner#define h2g_valid(x) ({ \ 6455fbe340e4937c4df99b1064178076a85e341ca89David Turner unsigned long __guest = (unsigned long)(x) - GUEST_BASE; \ 6465fbe340e4937c4df99b1064178076a85e341ca89David Turner __guest < (1ul << TARGET_VIRT_ADDR_SPACE_BITS); \ 6475fbe340e4937c4df99b1064178076a85e341ca89David Turner}) 6485fbe340e4937c4df99b1064178076a85e341ca89David Turner#endif 6495fbe340e4937c4df99b1064178076a85e341ca89David Turner 6505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define h2g(x) ({ \ 6515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner unsigned long __ret = (unsigned long)(x) - GUEST_BASE; \ 6525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* Check if given address fits target address space */ \ 6535fbe340e4937c4df99b1064178076a85e341ca89David Turner assert(h2g_valid(x)); \ 6545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner (abi_ulong)__ret; \ 6555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}) 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define saddr(x) g2h(x) 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define laddr(x) g2h(x) 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* !CONFIG_USER_ONLY */ 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* NOTE: we use double casts if pointers and target_ulong have 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project different sizes */ 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define saddr(x) (uint8_t *)(long)(x) 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define laddr(x) (uint8_t *)(long)(x) 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldub_raw(p) ldub_p(laddr((p))) 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsb_raw(p) ldsb_p(laddr((p))) 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lduw_raw(p) lduw_p(laddr((p))) 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsw_raw(p) ldsw_p(laddr((p))) 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldl_raw(p) ldl_p(laddr((p))) 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldq_raw(p) ldq_p(laddr((p))) 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfl_raw(p) ldfl_p(laddr((p))) 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfq_raw(p) ldfq_p(laddr((p))) 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stb_raw(p, v) stb_p(saddr((p)), v) 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stw_raw(p, v) stw_p(saddr((p)), v) 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stl_raw(p, v) stl_p(saddr((p)), v) 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stq_raw(p, v) stq_p(saddr((p)), v) 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfl_raw(p, v) stfl_p(saddr((p)), v) 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfq_raw(p, v) stfq_p(saddr((p)), v) 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_USER_ONLY) 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* if user mode, no other memory access functions */ 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldub(p) ldub_raw(p) 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsb(p) ldsb_raw(p) 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lduw(p) lduw_raw(p) 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsw(p) ldsw_raw(p) 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldl(p) ldl_raw(p) 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldq(p) ldq_raw(p) 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfl(p) ldfl_raw(p) 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfq(p) ldfq_raw(p) 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stb(p, v) stb_raw(p, v) 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stw(p, v) stw_raw(p, v) 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stl(p, v) stl_raw(p, v) 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stq(p, v) stq_raw(p, v) 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfl(p, v) stfl_raw(p, v) 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfq(p, v) stfq_raw(p, v) 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldub_code(p) ldub_raw(p) 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsb_code(p) ldsb_raw(p) 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lduw_code(p) lduw_raw(p) 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsw_code(p) ldsw_raw(p) 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldl_code(p) ldl_raw(p) 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldq_code(p) ldq_raw(p) 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldub_kernel(p) ldub_raw(p) 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsb_kernel(p) ldsb_raw(p) 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lduw_kernel(p) lduw_raw(p) 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldsw_kernel(p) ldsw_raw(p) 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldl_kernel(p) ldl_raw(p) 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldq_kernel(p) ldq_raw(p) 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfl_kernel(p) ldfl_raw(p) 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ldfq_kernel(p) ldfq_raw(p) 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stb_kernel(p, v) stb_raw(p, v) 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stw_kernel(p, v) stw_raw(p, v) 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stl_kernel(p, v) stl_raw(p, v) 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stq_kernel(p, v) stq_raw(p, v) 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfl_kernel(p, v) stfl_raw(p, v) 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define stfq_kernel(p, vt) stfq_raw(p, v) 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* defined(CONFIG_USER_ONLY) */ 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* page related stuff */ 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS) 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1) 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK) 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* ??? These should be the larger of unsigned long and target_ulong. */ 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern unsigned long qemu_real_host_page_size; 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern unsigned long qemu_host_page_bits; 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern unsigned long qemu_host_page_size; 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern unsigned long qemu_host_page_mask; 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define HOST_PAGE_ALIGN(addr) (((addr) + qemu_host_page_size - 1) & qemu_host_page_mask) 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* same as PROT_xxx */ 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PAGE_READ 0x0001 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PAGE_WRITE 0x0002 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PAGE_EXEC 0x0004 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC) 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PAGE_VALID 0x0008 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* original state of the write flag (used when tracking self-modifying 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project code */ 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PAGE_WRITE_ORG 0x0010 7485fbe340e4937c4df99b1064178076a85e341ca89David Turner#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY) 7495fbe340e4937c4df99b1064178076a85e341ca89David Turner/* FIXME: Code that sets/uses this is broken and needs to go away. */ 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PAGE_RESERVED 0x0020 7515fbe340e4937c4df99b1064178076a85e341ca89David Turner#endif 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7535fbe340e4937c4df99b1064178076a85e341ca89David Turner#if defined(CONFIG_USER_ONLY) 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid page_dump(FILE *f); 7555fbe340e4937c4df99b1064178076a85e341ca89David Turner 7565fbe340e4937c4df99b1064178076a85e341ca89David Turnertypedef int (*walk_memory_regions_fn)(void *, abi_ulong, 7575fbe340e4937c4df99b1064178076a85e341ca89David Turner abi_ulong, unsigned long); 7585fbe340e4937c4df99b1064178076a85e341ca89David Turnerint walk_memory_regions(void *, walk_memory_regions_fn); 7595fbe340e4937c4df99b1064178076a85e341ca89David Turner 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint page_get_flags(target_ulong address); 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid page_set_flags(target_ulong start, target_ulong end, int flags); 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint page_check_range(target_ulong start, target_ulong len, int flags); 7635fbe340e4937c4df99b1064178076a85e341ca89David Turner#endif 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectCPUState *cpu_copy(CPUState *env); 7665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerCPUState *qemu_get_cpu(int cpu); 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#define CPU_DUMP_CODE 0x00010000 769280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 770280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnervoid cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf, 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int flags); 772280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnervoid cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf, 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int flags); 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...) 776280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner GCC_FMT_ATTR(2, 3); 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern CPUState *first_cpu; 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern CPUState *cpu_single_env; 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_INTERRUPT_TIMER 0x08 /* internal timer exception pending */ 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_INTERRUPT_SMI 0x40 /* (x86 only) SMI interrupt pending */ 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_INTERRUPT_VIRQ 0x100 /* virtual interrupt pending. */ 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_INTERRUPT_NMI 0x200 /* NMI pending. */ 7843266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#define CPU_INTERRUPT_INIT 0x400 /* INIT pending. */ 7853266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#define CPU_INTERRUPT_SIPI 0x800 /* SIPI pending. */ 7863266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#define CPU_INTERRUPT_MCE 0x1000 /* (x86 only) MCE pending. */ 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7885285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Flags for use in ENV->INTERRUPT_PENDING. 7895285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 7905285864985be9077e58e42235af6582dee72e841David 'Digit' Turner The numbers assigned here are non-sequential in order to preserve 7915285864985be9077e58e42235af6582dee72e841David 'Digit' Turner binary compatibility with the vmstate dump. Bit 0 (0x0001) was 7925285864985be9077e58e42235af6582dee72e841David 'Digit' Turner previously used for CPU_INTERRUPT_EXIT, and is cleared when loading 7935285864985be9077e58e42235af6582dee72e841David 'Digit' Turner the vmstate dump. */ 7945285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 7955285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* External hardware interrupt pending. This is typically used for 7965285864985be9077e58e42235af6582dee72e841David 'Digit' Turner interrupts from devices. */ 7975285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_HARD 0x0002 7985285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 7995285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Exit the current TB. This is typically used when some system-level device 8005285864985be9077e58e42235af6582dee72e841David 'Digit' Turner makes some change to the memory mapping. E.g. the a20 line change. */ 8015285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_EXITTB 0x0004 8025285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 8035285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Halt the CPU. */ 8045285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_HALT 0x0020 8055285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 8065285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Debug event pending. */ 8075285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_DEBUG 0x0080 8085285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 8095285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Several target-specific external hardware interrupts. Each target/cpu.h 8105285864985be9077e58e42235af6582dee72e841David 'Digit' Turner should define proper names based on these defines. */ 8115285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_TGT_EXT_0 0x0008 8125285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_TGT_EXT_1 0x0010 8135285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_TGT_EXT_2 0x0040 8145285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_TGT_EXT_3 0x0200 8155285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_TGT_EXT_4 0x1000 8165285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 8175285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Several target-specific internal interrupts. These differ from the 8185285864985be9077e58e42235af6582dee72e841David 'Digit' Turner preceeding target-specific interrupts in that they are intended to 8195285864985be9077e58e42235af6582dee72e841David 'Digit' Turner originate from within the cpu itself, typically in response to some 8205285864985be9077e58e42235af6582dee72e841David 'Digit' Turner instruction being executed. These, therefore, are not masked while 8215285864985be9077e58e42235af6582dee72e841David 'Digit' Turner single-stepping within the debugger. */ 8225285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_TGT_INT_0 0x0100 8235285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_TGT_INT_1 0x0400 8245285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_TGT_INT_2 0x0800 8255285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 8265285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* First unused bit: 0x2000. */ 8275285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 8285285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* The set of all bits that should be masked when single-stepping. */ 8295285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_SSTEP_MASK \ 8305285864985be9077e58e42235af6582dee72e841David 'Digit' Turner (CPU_INTERRUPT_HARD \ 8315285864985be9077e58e42235af6582dee72e841David 'Digit' Turner | CPU_INTERRUPT_TGT_EXT_0 \ 8325285864985be9077e58e42235af6582dee72e841David 'Digit' Turner | CPU_INTERRUPT_TGT_EXT_1 \ 8335285864985be9077e58e42235af6582dee72e841David 'Digit' Turner | CPU_INTERRUPT_TGT_EXT_2 \ 8345285864985be9077e58e42235af6582dee72e841David 'Digit' Turner | CPU_INTERRUPT_TGT_EXT_3 \ 8355285864985be9077e58e42235af6582dee72e841David 'Digit' Turner | CPU_INTERRUPT_TGT_EXT_4) 8365285864985be9077e58e42235af6582dee72e841David 'Digit' Turner 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_interrupt(CPUState *s, int mask); 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_reset_interrupt(CPUState *env, int mask); 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid cpu_exit(CPUState *s); 8415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 8425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint qemu_cpu_has_work(CPUState *env); 8435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 8445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Breakpoint/watchpoint flags */ 8455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BP_MEM_READ 0x01 8465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BP_MEM_WRITE 0x02 8475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE) 8485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BP_STOP_BEFORE_ACCESS 0x04 8495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BP_WATCHPOINT_HIT 0x08 8505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BP_GDB 0x10 8515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define BP_CPU 0x20 8525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 8535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint cpu_breakpoint_insert(CPUState *env, target_ulong pc, int flags, 8545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner CPUBreakpoint **breakpoint); 8555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint cpu_breakpoint_remove(CPUState *env, target_ulong pc, int flags); 8565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid cpu_breakpoint_remove_by_ref(CPUState *env, CPUBreakpoint *breakpoint); 8575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid cpu_breakpoint_remove_all(CPUState *env, int mask); 8585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len, 8595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int flags, CPUWatchpoint **watchpoint); 8605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint cpu_watchpoint_remove(CPUState *env, target_ulong addr, 8615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_ulong len, int flags); 8625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid cpu_watchpoint_remove_by_ref(CPUState *env, CPUWatchpoint *watchpoint); 8635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid cpu_watchpoint_remove_all(CPUState *env, int mask); 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SSTEP_ENABLE 0x1 /* Enable simulated HW single stepping */ 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SSTEP_NOIRQ 0x2 /* Do not use IRQ while single stepping */ 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SSTEP_NOTIMER 0x4 /* Do not Timers while single stepping */ 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_single_step(CPUState *env, int enabled); 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_reset(CPUState *s); 8715fbe340e4937c4df99b1064178076a85e341ca89David Turnerint cpu_is_stopped(CPUState *env); 8725fbe340e4937c4df99b1064178076a85e341ca89David Turnervoid run_on_cpu(CPUState *env, void (*func)(void *data), void *data); 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_TB_OUT_ASM (1 << 0) 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_TB_IN_ASM (1 << 1) 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_TB_OP (1 << 2) 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_TB_OP_OPT (1 << 3) 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_INT (1 << 4) 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_EXEC (1 << 5) 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_PCALL (1 << 6) 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_IOPORT (1 << 7) 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_LOG_TB_CPU (1 << 8) 8835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define CPU_LOG_RESET (1 << 9) 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* define log items */ 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct CPULogItem { 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int mask; 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *name; 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *help; 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} CPULogItem; 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerextern const CPULogItem cpu_log_items[]; 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_set_log(int log_flags); 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_set_log_filename(const char *filename); 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_str_to_log_mask(const char *str); 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* IO ports API */ 8993266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner#include "ioport.h" 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9015fbe340e4937c4df99b1064178076a85e341ca89David Turner/* Return the physical page corresponding to a virtual one. Use it 9025fbe340e4937c4df99b1064178076a85e341ca89David Turner only for debugging because no protection checks are done. Return -1 9035fbe340e4937c4df99b1064178076a85e341ca89David Turner if no page found. */ 9045fbe340e4937c4df99b1064178076a85e341ca89David Turnertarget_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr); 9055fbe340e4937c4df99b1064178076a85e341ca89David Turner 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* memory API */ 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int phys_ram_fd; 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern ram_addr_t ram_size; 910280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 911280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner/* RAM is pre-allocated and passed into qemu_ram_alloc_from_ptr */ 912280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#define RAM_PREALLOC_MASK (1 << 0) 913280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 914280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnertypedef struct RAMBlock { 915280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner uint8_t *host; 916280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner ram_addr_t offset; 917280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner ram_addr_t length; 918280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner uint32_t flags; 919280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner char idstr[256]; 920280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner QLIST_ENTRY(RAMBlock) next; 921280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#if defined(__linux__) && !defined(TARGET_S390X) 922280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner int fd; 923280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner#endif 924280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner} RAMBlock; 925280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 926280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnertypedef struct RAMList { 927280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner uint8_t *phys_dirty; 928280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner QLIST_HEAD(ram, RAMBlock) blocks; 929280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner} RAMList; 930280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerextern RAMList ram_list; 931280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 932280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerextern const char *mem_path; 933280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerextern int mem_prealloc; 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* physical memory access */ 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* MMIO pages are identified by a combination of an IO device index and 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3 flags. The ROMD code stores the page ram offset in iotlb entry, 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project so only a limited number of ids are avaiable. */ 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IO_MEM_NB_ENTRIES (1 << (TARGET_PAGE_BITS - IO_MEM_SHIFT)) 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Flags stored in the low bits of the TLB virtual address. These are 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project defined so that fast path ram access is all zeros. */ 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Zero if TLB entry is valid. */ 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TLB_INVALID_MASK (1 << 3) 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Set if TLB entry references a clean RAM page. The iotlb entry will 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project contain the page physical address. */ 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TLB_NOTDIRTY (1 << 4) 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Set if TLB entry is an IO callback. */ 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TLB_MMIO (1 << 5) 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define VGA_DIRTY_FLAG 0x01 9545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define CODE_DIRTY_FLAG 0x02 9555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MIGRATION_DIRTY_FLAG 0x08 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* read dirty bit (return 0 or 1) */ 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline int cpu_physical_memory_is_dirty(ram_addr_t addr) 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 960280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] == 0xff; 961280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner} 962280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 963280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerstatic inline int cpu_physical_memory_get_dirty_flags(ram_addr_t addr) 964280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner{ 965280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS]; 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline int cpu_physical_memory_get_dirty(ram_addr_t addr, 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dirty_flags) 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 971280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] & dirty_flags; 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void cpu_physical_memory_set_dirty(ram_addr_t addr) 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 976280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] = 0xff; 977280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner} 978280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 979280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerstatic inline int cpu_physical_memory_set_dirty_flags(ram_addr_t addr, 980280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner int dirty_flags) 981280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner{ 982280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] |= dirty_flags; 983280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner} 984280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 985280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerstatic inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start, 986280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner int length, 987280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner int dirty_flags) 988280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner{ 989280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner int i, mask, len; 990280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner uint8_t *p; 991280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 992280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner len = length >> TARGET_PAGE_BITS; 993280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner mask = ~dirty_flags; 994280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner p = ram_list.phys_dirty + (start >> TARGET_PAGE_BITS); 995280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner for (i = 0; i < len; i++) { 996280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner p[i] &= mask; 997280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner } 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end, 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dirty_flags); 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_tlb_update_dirty(CPUState *env); 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint cpu_physical_memory_set_dirty_tracking(int enable); 10055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint cpu_physical_memory_get_dirty_tracking(void); 10075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint cpu_physical_sync_dirty_bitmap(target_phys_addr_t start_addr, 10095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_phys_addr_t end_addr); 10105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid dump_exec_info(FILE *f, 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int (*cpu_fprintf)(FILE *f, const char *fmt, ...)); 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Coalesced MMIO regions are areas where write operations can be reordered. 10155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * This usually implies that write operations are side-effect free. This allows 10165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * batching which can make a major impact on performance when using 10175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * virtualization. 10185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 10195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size); 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size); 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10239251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turnervoid qemu_flush_coalesced_mmio_buffer(void); 10249251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* profiling */ 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline int64_t profile_getclock(void) 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return cpu_get_real_ticks(); 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int64_t qemu_time, qemu_time_start; 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int64_t tlb_flush_time; 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int64_t dev_time; 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10385fbe340e4937c4df99b1064178076a85e341ca89David Turnerint cpu_memory_rw_debug(CPUState *env, target_ulong addr, 10395fbe340e4937c4df99b1064178076a85e341ca89David Turner uint8_t *buf, int len, int is_write); 10405fbe340e4937c4df99b1064178076a85e341ca89David Turner 10413266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turnervoid cpu_inject_x86_mce(CPUState *cenv, int bank, uint64_t status, 10423266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner uint64_t mcg_status, uint64_t addr, uint64_t misc); 10433266b5118e1d9ac13ea87bc24f37b50d22a2b81fDavid 'Digit' Turner 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* CPU_ALL_H */ 1045