~ppsspp/ppsspp/ppsspp_1.3.0

« back to all changes in this revision

Viewing changes to Core/HLE/ReplaceTables.h

  • Committer: Sérgio Benjamim
  • Date: 2017-01-02 00:12:05 UTC
  • Revision ID: sergio_br2@yahoo.com.br-20170102001205-cxbta9za203nmjwm
1.3.0 source (from ppsspp_1.3.0-r160.p5.l1762.a165.t83~56~ubuntu16.04.1.tar.xz).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright (c) 2012- PPSSPP Project.
 
2
 
 
3
// This program is free software: you can redistribute it and/or modify
 
4
// it under the terms of the GNU General Public License as published by
 
5
// the Free Software Foundation, version 2.0 or later versions.
 
6
 
 
7
// This program is distributed in the hope that it will be useful,
 
8
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
// GNU General Public License 2.0 for more details.
 
11
 
 
12
// A copy of the GPL 2.0 should have been included with the program.
 
13
// If not, see http://www.gnu.org/licenses/
 
14
 
 
15
// Official git repository and contact information can be found at
 
16
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
 
17
 
 
18
// Regular replacement funcs are just C functions. These take care of their
 
19
// own parameter parsing using the old school PARAM macros.
 
20
// The return value is the number of cycles to eat.
 
21
 
 
22
// JIT replacefuncs can be for inline or "outline" replacement.
 
23
// With inline replacement, we recognize the call to the functions
 
24
// at jal time already. With outline replacement, we just replace the
 
25
// implementation.
 
26
 
 
27
// In both cases the jit needs to know how much to subtract downcount.
 
28
//
 
29
// If the replacement func returned a positive number, this will be treated
 
30
// as the number of cycles to subtract.
 
31
// If the replacement func returns -1, it will be assumed that the subtraction
 
32
// was done by the replacement func.
 
33
 
 
34
#pragma once
 
35
 
 
36
#include <map>
 
37
 
 
38
#include "Common/CommonTypes.h"
 
39
#include "Core/MIPS/JitCommon/JitCommon.h"
 
40
 
 
41
typedef int (* ReplaceFunc)();
 
42
 
 
43
enum {
 
44
        REPFLAG_ALLOWINLINE = 0x01,
 
45
        // Used to keep things around but disable them.
 
46
        REPFLAG_DISABLED = 0x02,
 
47
        // Note that this will re-execute in a function that loops at start.
 
48
        REPFLAG_HOOKENTER = 0x04,
 
49
        // Only hooks jr ra, so only use on funcs that have that.
 
50
        REPFLAG_HOOKEXIT = 0x08,
 
51
};
 
52
 
 
53
// Kind of similar to HLE functions but with different data.
 
54
struct ReplacementTableEntry {
 
55
        const char *name;
 
56
        ReplaceFunc replaceFunc;
 
57
        MIPSComp::MIPSReplaceFunc jitReplaceFunc;
 
58
        int flags;
 
59
        s32 hookOffset;
 
60
};
 
61
 
 
62
void Replacement_Init();
 
63
void Replacement_Shutdown();
 
64
 
 
65
int GetNumReplacementFuncs();
 
66
std::vector<int> GetReplacementFuncIndexes(u64 hash, int funcSize);
 
67
const ReplacementTableEntry *GetReplacementFunc(int index);
 
68
 
 
69
void WriteReplaceInstructions(u32 address, u64 hash, int size);
 
70
void RestoreReplacedInstruction(u32 address);
 
71
void RestoreReplacedInstructions(u32 startAddr, u32 endAddr);
 
72
bool GetReplacedOpAt(u32 address, u32 *op);
 
73
bool CanReplaceJalTo(u32 dest, const ReplacementTableEntry **entry, u32 *funcSize);
 
74
 
 
75
// For savestates.  If you call SaveAndClearReplacements(), you must call RestoreSavedReplacements().
 
76
std::map<u32, u32> SaveAndClearReplacements();
 
77
void RestoreSavedReplacements(const std::map<u32, u32> &saved);