Commit | Line | Data |
---|---|---|
d16005f8 | 1 | /* |
a59e5536 | 2 | * Copyright (C) 2016-2020 Paul Cercueil <paul@crapouillou.net> |
d16005f8 PC |
3 | * |
4 | * This library is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU Lesser General Public | |
6 | * License as published by the Free Software Foundation; either | |
7 | * version 2.1 of the License, or (at your option) any later version. | |
8 | * | |
9 | * This library is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | * Lesser General Public License for more details. | |
13 | */ | |
14 | ||
15 | #ifndef __LIGHTREC_H__ | |
16 | #define __LIGHTREC_H__ | |
17 | ||
18 | #ifdef __cplusplus | |
19 | #define _Bool bool | |
20 | extern "C" { | |
21 | #endif | |
22 | ||
23 | #include <stddef.h> | |
24 | #include <stdint.h> | |
25 | ||
26 | #ifdef _WIN32 | |
27 | # ifdef lightrec_EXPORTS | |
28 | # define __api __declspec(dllexport) | |
29 | # elif !defined(LIGHTREC_STATIC) | |
30 | # define __api __declspec(dllimport) | |
31 | # else | |
32 | # define __api | |
33 | # endif | |
34 | #elif __GNUC__ >= 4 | |
35 | # define __api __attribute__((visibility ("default"))) | |
36 | #else | |
37 | # define __api | |
38 | #endif | |
39 | ||
40 | typedef uint64_t u64; | |
41 | typedef uint32_t u32; | |
42 | typedef uint16_t u16; | |
43 | typedef uint8_t u8; | |
44 | ||
45 | typedef int64_t s64; | |
46 | typedef int32_t s32; | |
47 | typedef int16_t s16; | |
48 | typedef int8_t s8; | |
49 | ||
50 | struct lightrec_state; | |
51 | struct lightrec_mem_map; | |
52 | ||
53 | /* Exit flags */ | |
54 | #define LIGHTREC_EXIT_NORMAL (0) | |
55 | #define LIGHTREC_EXIT_SYSCALL (1 << 0) | |
56 | #define LIGHTREC_EXIT_BREAK (1 << 1) | |
57 | #define LIGHTREC_EXIT_CHECK_INTERRUPT (1 << 2) | |
58 | #define LIGHTREC_EXIT_SEGFAULT (1 << 3) | |
59 | ||
60 | enum psx_map { | |
61 | PSX_MAP_KERNEL_USER_RAM, | |
62 | PSX_MAP_BIOS, | |
63 | PSX_MAP_SCRATCH_PAD, | |
64 | PSX_MAP_PARALLEL_PORT, | |
65 | PSX_MAP_HW_REGISTERS, | |
66 | PSX_MAP_CACHE_CONTROL, | |
67 | PSX_MAP_MIRROR1, | |
68 | PSX_MAP_MIRROR2, | |
69 | PSX_MAP_MIRROR3, | |
70 | }; | |
71 | ||
72 | enum mem_type { | |
73 | MEM_FOR_CODE, | |
74 | MEM_FOR_MIPS_CODE, | |
75 | MEM_FOR_IR, | |
76 | MEM_FOR_LIGHTREC, | |
77 | MEM_TYPE_END, | |
78 | }; | |
79 | ||
80 | struct lightrec_mem_map_ops { | |
a59e5536 | 81 | void (*sb)(struct lightrec_state *, u32 opcode, |
82 | void *host, u32 addr, u8 data); | |
83 | void (*sh)(struct lightrec_state *, u32 opcode, | |
84 | void *host, u32 addr, u16 data); | |
85 | void (*sw)(struct lightrec_state *, u32 opcode, | |
86 | void *host, u32 addr, u32 data); | |
87 | u8 (*lb)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
88 | u16 (*lh)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
89 | u32 (*lw)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
d16005f8 PC |
90 | }; |
91 | ||
92 | struct lightrec_mem_map { | |
93 | u32 pc; | |
94 | u32 length; | |
95 | void *address; | |
96 | const struct lightrec_mem_map_ops *ops; | |
97 | const struct lightrec_mem_map *mirror_of; | |
98 | }; | |
99 | ||
100 | struct lightrec_cop_ops { | |
a59e5536 | 101 | u32 (*mfc)(struct lightrec_state *state, u32 op, u8 reg); |
102 | u32 (*cfc)(struct lightrec_state *state, u32 op, u8 reg); | |
103 | void (*mtc)(struct lightrec_state *state, u32 op, u8 reg, u32 value); | |
104 | void (*ctc)(struct lightrec_state *state, u32 op, u8 reg, u32 value); | |
105 | void (*op)(struct lightrec_state *state, u32 op); | |
d16005f8 PC |
106 | }; |
107 | ||
108 | struct lightrec_ops { | |
109 | struct lightrec_cop_ops cop0_ops; | |
110 | struct lightrec_cop_ops cop2_ops; | |
111 | }; | |
112 | ||
113 | __api struct lightrec_state *lightrec_init(char *argv0, | |
114 | const struct lightrec_mem_map *map, | |
115 | size_t nb, | |
116 | const struct lightrec_ops *ops); | |
117 | ||
118 | __api void lightrec_destroy(struct lightrec_state *state); | |
119 | ||
120 | __api u32 lightrec_execute(struct lightrec_state *state, | |
121 | u32 pc, u32 target_cycle); | |
122 | __api u32 lightrec_execute_one(struct lightrec_state *state, u32 pc); | |
123 | __api u32 lightrec_run_interpreter(struct lightrec_state *state, u32 pc); | |
124 | ||
125 | __api void lightrec_invalidate(struct lightrec_state *state, u32 addr, u32 len); | |
126 | __api void lightrec_invalidate_all(struct lightrec_state *state); | |
127 | __api void lightrec_set_invalidate_mode(struct lightrec_state *state, | |
128 | _Bool dma_only); | |
129 | ||
130 | __api void lightrec_set_exit_flags(struct lightrec_state *state, u32 flags); | |
131 | __api u32 lightrec_exit_flags(struct lightrec_state *state); | |
132 | ||
133 | __api void lightrec_dump_registers(struct lightrec_state *state, u32 regs[34]); | |
134 | __api void lightrec_restore_registers(struct lightrec_state *state, | |
135 | u32 regs[34]); | |
136 | ||
137 | __api u32 lightrec_current_cycle_count(const struct lightrec_state *state); | |
138 | __api void lightrec_reset_cycle_count(struct lightrec_state *state, u32 cycles); | |
139 | __api void lightrec_set_target_cycle_count(struct lightrec_state *state, | |
140 | u32 cycles); | |
141 | ||
142 | __api unsigned int lightrec_get_mem_usage(enum mem_type type); | |
143 | __api unsigned int lightrec_get_total_mem_usage(void); | |
144 | __api float lightrec_get_average_ipi(void); | |
145 | ||
146 | #ifdef __cplusplus | |
147 | }; | |
148 | #endif | |
149 | ||
150 | #endif /* __LIGHTREC_H__ */ |