2016-12-21 13:28:48 +05:30
# ifndef __IO_R2K_LINUX_H__
# define __IO_R2K_LINUX_H__
# include <r_io.h>
# include <r_lib.h>
# include <r_types.h>
# include <r_print.h>
# include <r_util.h>
# include <sys/types.h>
# include <sys/ioctl.h>
# include <sys/mman.h>
# include <errno.h>
# define MAX_PHYS_ADDR 128
2016-12-22 18:55:00 +05:30
/*
* Backend Id ( be_id ) :
* 0 : Linear Address
* 1 : Process Address
* 2 : Physical Address
*/
struct io_r2k_linux {
int beid ;
int pid ;
2016-12-29 00:20:08 +01:00
ut8 wp ;
2016-12-22 18:55:00 +05:30
} ;
2016-12-21 13:28:48 +05:30
struct r2k_data {
int pid ;
size_t addr ;
size_t len ;
ut8 * buff ;
2016-12-29 00:20:08 +01:00
ut8 wp ;
2016-12-21 13:28:48 +05:30
} ;
struct r2k_kernel_map_info {
size_t start_addr ;
size_t end_addr ;
size_t phys_addr [ MAX_PHYS_ADDR ] ;
int n_pages ;
int n_phys_addr ;
} ;
struct r2k_kernel_maps {
int n_entries ;
int size ;
} ;
struct r2k_control_reg {
# if __x86_64__ || __i386__
size_t cr0 ;
size_t cr1 ;
size_t cr2 ;
size_t cr3 ;
size_t cr4 ;
# if __x86_64__
size_t cr8 ;
# endif
# elif __arm__
size_t ttbr0 ;
size_t ttbr1 ;
size_t ttbcr ;
size_t c1 ;
size_t c3 ;
# elif __arm64__ || __aarch64__
size_t sctlr_el1 ;
size_t ttbr0_el1 ;
size_t ttbr1_el1 ;
size_t tcr_el1 ;
# endif
} ;
struct r2k_proc_info {
int pid ;
char comm [ 16 ] ;
size_t vmareastruct [ 4096 ] ;
size_t stack ;
} ;
# define R2_TYPE 0x69
# define READ_KERNEL_MEMORY 0x1
# define WRITE_KERNEL_MEMORY 0x2
# define READ_PROCESS_ADDR 0x3
# define WRITE_PROCESS_ADDR 0X4
# define READ_PHYSICAL_ADDR 0x5
# define WRITE_PHYSICAL_ADDR 0x6
# define GET_KERNEL_MAP 0x7
# define READ_CONTROL_REG 0x8
# define PRINT_PROC_INFO 0x9
# ifdef _IOC_TYPECHECK
# define r2k_data_size struct r2k_data
# define r2k_kernel_maps_size struct r2k_kernel_maps
# define r2k_control_reg_size struct r2k_control_reg
# define r2k_proc_info_size struct r2k_proc_info
# else
# define r2k_data_size sizeof (struct r2k_data)
# define r2k_kernel_maps_size sizeof (struct r2k_kernel_maps)
# define r2k_control_reg_size sizeof (struct r2k_control_reg)
# define r2k_proc_info_size sizeof (struct r2k_proc_info)
# endif
# define IOCTL_READ_KERNEL_MEMORY _IOR (R2_TYPE, READ_KERNEL_MEMORY, r2k_data_size)
# define IOCTL_WRITE_KERNEL_MEMORY _IOR (R2_TYPE, WRITE_KERNEL_MEMORY, r2k_data_size)
# define IOCTL_READ_PROCESS_ADDR _IOR (R2_TYPE, READ_PROCESS_ADDR, r2k_data_size)
# define IOCTL_WRITE_PROCESS_ADDR _IOR (R2_TYPE, WRITE_PROCESS_ADDR, r2k_data_size)
# define IOCTL_READ_PHYSICAL_ADDR _IOR (R2_TYPE, READ_PHYSICAL_ADDR, r2k_data_size)
# define IOCTL_WRITE_PHYSICAL_ADDR _IOR (R2_TYPE, WRITE_PHYSICAL_ADDR, r2k_data_size)
# define IOCTL_GET_KERNEL_MAP _IOR (R2_TYPE, GET_KERNEL_MAP, r2k_kernel_maps_size)
# define IOCTL_READ_CONTROL_REG _IOR (R2_TYPE, READ_CONTROL_REG, r2k_control_reg_size)
# define IOCTL_PRINT_PROC_INFO _IOR (R2_TYPE, PRINT_PROC_INFO, r2k_data_size) // Bad hack. Incorrect size, but since module does not use _IOC_SIZE, it won't matter if size parameter is wrong
# define VM_READ 0x1
# define VM_WRITE 0x2
# define VM_EXEC 0x4
# define VM_MAYSHARE 0x80
2016-12-22 18:55:00 +05:30
extern struct io_r2k_linux r2k_struct ;
2016-12-21 13:28:48 +05:30
int ReadMemory ( RIO * io , RIODesc * iodesc , int ioctl_n , size_t pid , size_t address , ut8 * buf , int len ) ;
int WriteMemory ( RIO * io , RIODesc * iodesc , int ioctl_n , size_t pid , ut64 address , const ut8 * buf , int len ) ;
int run_ioctl_command ( RIO * io , RIODesc * iodesc , const char * buf ) ;
# endif