Commit | Line | Data |
---|---|---|
98fa08a5 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
d16005f8 | 2 | /* |
98fa08a5 | 3 | * Copyright (C) 2016-2021 Paul Cercueil <paul@crapouillou.net> |
d16005f8 PC |
4 | */ |
5 | ||
6 | #ifndef __LIGHTREC_H__ | |
7 | #define __LIGHTREC_H__ | |
8 | ||
9 | #ifdef __cplusplus | |
10 | #define _Bool bool | |
11 | extern "C" { | |
12 | #endif | |
13 | ||
14 | #include <stddef.h> | |
15 | #include <stdint.h> | |
16 | ||
17 | #ifdef _WIN32 | |
18 | # ifdef lightrec_EXPORTS | |
19 | # define __api __declspec(dllexport) | |
20 | # elif !defined(LIGHTREC_STATIC) | |
21 | # define __api __declspec(dllimport) | |
22 | # else | |
23 | # define __api | |
24 | # endif | |
25 | #elif __GNUC__ >= 4 | |
26 | # define __api __attribute__((visibility ("default"))) | |
27 | #else | |
28 | # define __api | |
29 | #endif | |
30 | ||
31 | typedef uint64_t u64; | |
32 | typedef uint32_t u32; | |
33 | typedef uint16_t u16; | |
34 | typedef uint8_t u8; | |
35 | ||
36 | typedef int64_t s64; | |
37 | typedef int32_t s32; | |
38 | typedef int16_t s16; | |
39 | typedef int8_t s8; | |
40 | ||
41 | struct lightrec_state; | |
42 | struct lightrec_mem_map; | |
43 | ||
44 | /* Exit flags */ | |
45 | #define LIGHTREC_EXIT_NORMAL (0) | |
98fa08a5 | 46 | #define LIGHTREC_EXIT_CHECK_INTERRUPT (1 << 0) |
d16005f8 | 47 | #define LIGHTREC_EXIT_BREAK (1 << 1) |
98fa08a5 | 48 | #define LIGHTREC_EXIT_SYSCALL (1 << 2) |
d16005f8 | 49 | #define LIGHTREC_EXIT_SEGFAULT (1 << 3) |
d8b04acd | 50 | #define LIGHTREC_EXIT_NOMEM (1 << 4) |
d16005f8 PC |
51 | |
52 | enum psx_map { | |
53 | PSX_MAP_KERNEL_USER_RAM, | |
54 | PSX_MAP_BIOS, | |
55 | PSX_MAP_SCRATCH_PAD, | |
56 | PSX_MAP_PARALLEL_PORT, | |
57 | PSX_MAP_HW_REGISTERS, | |
58 | PSX_MAP_CACHE_CONTROL, | |
59 | PSX_MAP_MIRROR1, | |
60 | PSX_MAP_MIRROR2, | |
61 | PSX_MAP_MIRROR3, | |
02487de7 PC |
62 | PSX_MAP_CODE_BUFFER, |
63 | ||
64 | PSX_MAP_UNKNOWN, | |
d16005f8 PC |
65 | }; |
66 | ||
d16005f8 | 67 | struct lightrec_mem_map_ops { |
a59e5536 | 68 | void (*sb)(struct lightrec_state *, u32 opcode, |
69 | void *host, u32 addr, u8 data); | |
70 | void (*sh)(struct lightrec_state *, u32 opcode, | |
71 | void *host, u32 addr, u16 data); | |
72 | void (*sw)(struct lightrec_state *, u32 opcode, | |
73 | void *host, u32 addr, u32 data); | |
74 | u8 (*lb)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
75 | u16 (*lh)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
76 | u32 (*lw)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
d16005f8 PC |
77 | }; |
78 | ||
79 | struct lightrec_mem_map { | |
80 | u32 pc; | |
81 | u32 length; | |
82 | void *address; | |
83 | const struct lightrec_mem_map_ops *ops; | |
84 | const struct lightrec_mem_map *mirror_of; | |
85 | }; | |
86 | ||
98fa08a5 PC |
87 | struct lightrec_ops { |
88 | void (*cop2_op)(struct lightrec_state *state, u32 op); | |
89 | void (*enable_ram)(struct lightrec_state *state, _Bool enable); | |
d16005f8 PC |
90 | }; |
91 | ||
98fa08a5 PC |
92 | struct lightrec_registers { |
93 | u32 gpr[34]; | |
94 | u32 cp0[32]; | |
95 | u32 cp2d[32]; | |
96 | u32 cp2c[32]; | |
d16005f8 PC |
97 | }; |
98 | ||
99 | __api struct lightrec_state *lightrec_init(char *argv0, | |
100 | const struct lightrec_mem_map *map, | |
101 | size_t nb, | |
102 | const struct lightrec_ops *ops); | |
103 | ||
104 | __api void lightrec_destroy(struct lightrec_state *state); | |
105 | ||
106 | __api u32 lightrec_execute(struct lightrec_state *state, | |
107 | u32 pc, u32 target_cycle); | |
108 | __api u32 lightrec_execute_one(struct lightrec_state *state, u32 pc); | |
109 | __api u32 lightrec_run_interpreter(struct lightrec_state *state, u32 pc); | |
110 | ||
111 | __api void lightrec_invalidate(struct lightrec_state *state, u32 addr, u32 len); | |
112 | __api void lightrec_invalidate_all(struct lightrec_state *state); | |
113 | __api void lightrec_set_invalidate_mode(struct lightrec_state *state, | |
114 | _Bool dma_only); | |
115 | ||
116 | __api void lightrec_set_exit_flags(struct lightrec_state *state, u32 flags); | |
117 | __api u32 lightrec_exit_flags(struct lightrec_state *state); | |
118 | ||
98fa08a5 | 119 | __api struct lightrec_registers * lightrec_get_registers(struct lightrec_state *state); |
d16005f8 PC |
120 | |
121 | __api u32 lightrec_current_cycle_count(const struct lightrec_state *state); | |
122 | __api void lightrec_reset_cycle_count(struct lightrec_state *state, u32 cycles); | |
123 | __api void lightrec_set_target_cycle_count(struct lightrec_state *state, | |
124 | u32 cycles); | |
125 | ||
d16005f8 PC |
126 | #ifdef __cplusplus |
127 | }; | |
128 | #endif | |
129 | ||
130 | #endif /* __LIGHTREC_H__ */ |