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