summaryrefslogtreecommitdiffstats
path: root/src/core/arm/skyeye_common/armmmu.h
blob: 5423588c01c7c54017ead95b1ac5db85d55c9090 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
    armmmu.c - Memory Management Unit emulation.
    ARMulator extensions for the ARM7100 family.
    Copyright (C) 1999  Ben Williamson

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#pragma once

#include "common/swap.h"

#include "core/memory.h"
#include "core/arm/skyeye_common/armstate.h"
#include "core/arm/skyeye_common/armsupp.h"

// Register numbers in the MMU
enum
{
    MMU_ID = 0,
    MMU_CONTROL = 1,
    MMU_TRANSLATION_TABLE_BASE = 2,
    MMU_DOMAIN_ACCESS_CONTROL = 3,
    MMU_FAULT_STATUS = 5,
    MMU_FAULT_ADDRESS = 6,
    MMU_CACHE_OPS = 7,
    MMU_TLB_OPS = 8,
    MMU_CACHE_LOCKDOWN = 9,
    MMU_TLB_LOCKDOWN = 10,
    MMU_PID = 13,

    // MMU_V4
    MMU_V4_CACHE_OPS = 7,
    MMU_V4_TLB_OPS = 8,

    // MMU_V3
    MMU_V3_FLUSH_TLB = 5,
    MMU_V3_FLUSH_TLB_ENTRY = 6,
    MMU_V3_FLUSH_CACHE = 7,
};

// Reads data in big/little endian format based on the
// state of the E (endian) bit in the emulated CPU's APSR.
inline u16 ReadMemory16(ARMul_State* cpu, u32 address) {
    u16 data = Memory::Read16(address);

    if (InBigEndianMode(cpu))
        data = Common::swap16(data);

    return data;
}

inline u32 ReadMemory32(ARMul_State* cpu, u32 address) {
    u32 data = Memory::Read32(address);

    if (InBigEndianMode(cpu))
        data = Common::swap32(data);

    return data;
}

inline u64 ReadMemory64(ARMul_State* cpu, u32 address) {
    u64 data = Memory::Read64(address);

    if (InBigEndianMode(cpu))
        data = Common::swap64(data);

    return data;
}

// Writes data in big/little endian format based on the
// state of the E (endian) bit in the emulated CPU's APSR.
inline void WriteMemory16(ARMul_State* cpu, u32 address, u16 data) {
    if (InBigEndianMode(cpu))
        data = Common::swap16(data);

    Memory::Write16(address, data);
}

inline void WriteMemory32(ARMul_State* cpu, u32 address, u32 data) {
    if (InBigEndianMode(cpu))
        data = Common::swap32(data);

    Memory::Write32(address, data);
}

inline void WriteMemory64(ARMul_State* cpu, u32 address, u64 data) {
    if (InBigEndianMode(cpu))
        data = Common::swap64(data);

    Memory::Write64(address, data);
}