git subrepo pull --force deps/lightrec
[pcsx_rearmed.git] / deps / lightrec / lightrec.h
index d3d896c..3be8e0a 100644 (file)
@@ -1,15 +1,6 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
 /*
- * Copyright (C) 2016 Paul Cercueil <paul@crapouillou.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
+ * Copyright (C) 2016-2021 Paul Cercueil <paul@crapouillou.net>
  */
 
 #ifndef __LIGHTREC_H__
@@ -37,6 +28,21 @@ extern "C" {
 #   define __api
 #endif
 
+#ifndef __cnst
+#   ifdef __GNUC__
+#      define __cnst __attribute__((const))
+#   else
+#      define __cnst
+#   endif
+#endif
+#ifndef __pure
+#   ifdef __GNUC__
+#      define __pure __attribute__((pure))
+#   else
+#      define __pure
+#   endif
+#endif
+
 typedef uint64_t u64;
 typedef uint32_t u32;
 typedef uint16_t u16;
@@ -52,10 +58,16 @@ struct lightrec_mem_map;
 
 /* Exit flags */
 #define LIGHTREC_EXIT_NORMAL   (0)
-#define LIGHTREC_EXIT_SYSCALL  (1 << 0)
+#define LIGHTREC_EXIT_CHECK_INTERRUPT  (1 << 0)
 #define LIGHTREC_EXIT_BREAK    (1 << 1)
-#define LIGHTREC_EXIT_CHECK_INTERRUPT  (1 << 2)
+#define LIGHTREC_EXIT_SYSCALL  (1 << 2)
 #define LIGHTREC_EXIT_SEGFAULT (1 << 3)
+#define LIGHTREC_EXIT_NOMEM    (1 << 4)
+#define LIGHTREC_EXIT_UNKNOWN_OP       (1 << 5)
+
+/* Unsafe optimizations flags */
+#define LIGHTREC_OPT_INV_DMA_ONLY      (1 << 0)
+#define LIGHTREC_OPT_SP_GP_HIT_RAM     (1 << 1)
 
 enum psx_map {
        PSX_MAP_KERNEL_USER_RAM,
@@ -67,23 +79,25 @@ enum psx_map {
        PSX_MAP_MIRROR1,
        PSX_MAP_MIRROR2,
        PSX_MAP_MIRROR3,
-};
+       PSX_MAP_CODE_BUFFER,
+       PSX_MAP_PPORT_MIRROR,
 
-enum mem_type {
-       MEM_FOR_CODE,
-       MEM_FOR_MIPS_CODE,
-       MEM_FOR_IR,
-       MEM_FOR_LIGHTREC,
-       MEM_TYPE_END,
+       PSX_MAP_UNKNOWN,
 };
 
 struct lightrec_mem_map_ops {
-       void (*sb)(struct lightrec_state *, u32 addr, u8 data);
-       void (*sh)(struct lightrec_state *, u32 addr, u16 data);
-       void (*sw)(struct lightrec_state *, u32 addr, u32 data);
-       u8 (*lb)(struct lightrec_state *, u32 addr);
-       u16 (*lh)(struct lightrec_state *, u32 addr);
-       u32 (*lw)(struct lightrec_state *, u32 addr);
+       void (*sb)(struct lightrec_state *, u32 opcode,
+                  void *host, u32 addr, u32 data);
+       void (*sh)(struct lightrec_state *, u32 opcode,
+                  void *host, u32 addr, u32 data);
+       void (*sw)(struct lightrec_state *, u32 opcode,
+                  void *host, u32 addr, u32 data);
+       u8 (*lb)(struct lightrec_state *, u32 opcode, void *host, u32 addr);
+       u16 (*lh)(struct lightrec_state *, u32 opcode, void *host, u32 addr);
+       u32 (*lw)(struct lightrec_state *, u32 opcode, void *host, u32 addr);
+       u32 (*lwu)(struct lightrec_state *, u32 opcode, void *host, u32 addr);
+       void (*swu)(struct lightrec_state *, u32 opcode,
+                   void *host, u32 addr, u32 data);
 };
 
 struct lightrec_mem_map {
@@ -94,17 +108,19 @@ struct lightrec_mem_map {
        const struct lightrec_mem_map *mirror_of;
 };
 
-struct lightrec_cop_ops {
-       u32 (*mfc)(struct lightrec_state *state, u8 reg);
-       u32 (*cfc)(struct lightrec_state *state, u8 reg);
-       void (*mtc)(struct lightrec_state *state, u8 reg, u32 value);
-       void (*ctc)(struct lightrec_state *state, u8 reg, u32 value);
-       void (*op)(struct lightrec_state *state, u32 opcode);
+struct lightrec_ops {
+       void (*cop2_notify)(struct lightrec_state *state, u32 op, u32 data);
+       void (*cop2_op)(struct lightrec_state *state, u32 op);
+       void (*enable_ram)(struct lightrec_state *state, _Bool enable);
+       _Bool (*hw_direct)(u32 kaddr, _Bool is_write, u8 size);
+       void (*code_inv)(void *addr, u32 len);
 };
 
-struct lightrec_ops {
-       struct lightrec_cop_ops cop0_ops;
-       struct lightrec_cop_ops cop2_ops;
+struct lightrec_registers {
+       u32 gpr[34];
+       u32 cp0[32];
+       u32 cp2d[32];
+       u32 cp2c[32];
 };
 
 __api struct lightrec_state *lightrec_init(char *argv0,
@@ -116,29 +132,25 @@ __api void lightrec_destroy(struct lightrec_state *state);
 
 __api u32 lightrec_execute(struct lightrec_state *state,
                           u32 pc, u32 target_cycle);
-__api u32 lightrec_execute_one(struct lightrec_state *state, u32 pc);
-__api u32 lightrec_run_interpreter(struct lightrec_state *state, u32 pc);
+__api u32 lightrec_run_interpreter(struct lightrec_state *state,
+                                  u32 pc, u32 target_cycle);
 
 __api void lightrec_invalidate(struct lightrec_state *state, u32 addr, u32 len);
 __api void lightrec_invalidate_all(struct lightrec_state *state);
-__api void lightrec_set_invalidate_mode(struct lightrec_state *state,
-                                       _Bool dma_only);
 
 __api void lightrec_set_exit_flags(struct lightrec_state *state, u32 flags);
 __api u32 lightrec_exit_flags(struct lightrec_state *state);
 
-__api void lightrec_dump_registers(struct lightrec_state *state, u32 regs[34]);
-__api void lightrec_restore_registers(struct lightrec_state *state,
-                                     u32 regs[34]);
+__api void lightrec_set_unsafe_opt_flags(struct lightrec_state *state, u32 flags);
+
+__api __cnst struct lightrec_registers *
+lightrec_get_registers(struct lightrec_state *state);
 
 __api u32 lightrec_current_cycle_count(const struct lightrec_state *state);
 __api void lightrec_reset_cycle_count(struct lightrec_state *state, u32 cycles);
 __api void lightrec_set_target_cycle_count(struct lightrec_state *state,
                                           u32 cycles);
-
-__api unsigned int lightrec_get_mem_usage(enum mem_type type);
-__api unsigned int lightrec_get_total_mem_usage(void);
-__api float lightrec_get_average_ipi(void);
+__api void lightrec_set_cycles_per_opcode(struct lightrec_state *state, u32 cycles);
 
 #ifdef __cplusplus
 };