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 PC |
49 | #define LIGHTREC_EXIT_SEGFAULT (1 << 3) |
50 | ||
51 | enum psx_map { | |
52 | PSX_MAP_KERNEL_USER_RAM, | |
53 | PSX_MAP_BIOS, | |
54 | PSX_MAP_SCRATCH_PAD, | |
55 | PSX_MAP_PARALLEL_PORT, | |
56 | PSX_MAP_HW_REGISTERS, | |
57 | PSX_MAP_CACHE_CONTROL, | |
58 | PSX_MAP_MIRROR1, | |
59 | PSX_MAP_MIRROR2, | |
60 | PSX_MAP_MIRROR3, | |
61 | }; | |
62 | ||
d16005f8 | 63 | struct lightrec_mem_map_ops { |
a59e5536 | 64 | void (*sb)(struct lightrec_state *, u32 opcode, |
65 | void *host, u32 addr, u8 data); | |
66 | void (*sh)(struct lightrec_state *, u32 opcode, | |
67 | void *host, u32 addr, u16 data); | |
68 | void (*sw)(struct lightrec_state *, u32 opcode, | |
69 | void *host, u32 addr, u32 data); | |
70 | u8 (*lb)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
71 | u16 (*lh)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
72 | u32 (*lw)(struct lightrec_state *, u32 opcode, void *host, u32 addr); | |
d16005f8 PC |
73 | }; |
74 | ||
75 | struct lightrec_mem_map { | |
76 | u32 pc; | |
77 | u32 length; | |
78 | void *address; | |
79 | const struct lightrec_mem_map_ops *ops; | |
80 | const struct lightrec_mem_map *mirror_of; | |
81 | }; | |
82 | ||
98fa08a5 PC |
83 | struct lightrec_ops { |
84 | void (*cop2_op)(struct lightrec_state *state, u32 op); | |
85 | void (*enable_ram)(struct lightrec_state *state, _Bool enable); | |
d16005f8 PC |
86 | }; |
87 | ||
98fa08a5 PC |
88 | struct lightrec_registers { |
89 | u32 gpr[34]; | |
90 | u32 cp0[32]; | |
91 | u32 cp2d[32]; | |
92 | u32 cp2c[32]; | |
d16005f8 PC |
93 | }; |
94 | ||
95 | __api struct lightrec_state *lightrec_init(char *argv0, | |
96 | const struct lightrec_mem_map *map, | |
97 | size_t nb, | |
98 | const struct lightrec_ops *ops); | |
99 | ||
100 | __api void lightrec_destroy(struct lightrec_state *state); | |
101 | ||
102 | __api u32 lightrec_execute(struct lightrec_state *state, | |
103 | u32 pc, u32 target_cycle); | |
104 | __api u32 lightrec_execute_one(struct lightrec_state *state, u32 pc); | |
105 | __api u32 lightrec_run_interpreter(struct lightrec_state *state, u32 pc); | |
106 | ||
107 | __api void lightrec_invalidate(struct lightrec_state *state, u32 addr, u32 len); | |
108 | __api void lightrec_invalidate_all(struct lightrec_state *state); | |
109 | __api void lightrec_set_invalidate_mode(struct lightrec_state *state, | |
110 | _Bool dma_only); | |
111 | ||
112 | __api void lightrec_set_exit_flags(struct lightrec_state *state, u32 flags); | |
113 | __api u32 lightrec_exit_flags(struct lightrec_state *state); | |
114 | ||
98fa08a5 | 115 | __api struct lightrec_registers * lightrec_get_registers(struct lightrec_state *state); |
d16005f8 PC |
116 | |
117 | __api u32 lightrec_current_cycle_count(const struct lightrec_state *state); | |
118 | __api void lightrec_reset_cycle_count(struct lightrec_state *state, u32 cycles); | |
119 | __api void lightrec_set_target_cycle_count(struct lightrec_state *state, | |
120 | u32 cycles); | |
121 | ||
d16005f8 PC |
122 | #ifdef __cplusplus |
123 | }; | |
124 | #endif | |
125 | ||
126 | #endif /* __LIGHTREC_H__ */ |