SmartAudio/lichee/linux-4.9/drivers/char/oases/patch_file.h

131 lines
3.7 KiB
C
Executable File

#ifndef _OASES_PATCH_FILE_H_
#define _OASES_PATCH_FILE_H_
#include <linux/types.h>
#define PATCH_FILE_MAGIC "OASES16\0"
#define PATCH_MAGIC_SIZE 8
#define PATCH_ID_LEN 64
#define PATCH_NAME_LEN 20
#define OASES_SIG_STRING "~OASES signature appended~\n"
#define RELOC_FUNC_NAME_SIZE 64
#define PATCH_MAX_SIZE PAGE_SIZE * 4
struct oases_patch_info;
struct reloc_function_info {
unsigned int offset;
char name[RELOC_FUNC_NAME_SIZE];
};
#if OASES_ENABLE_PRECISE_PATCH
struct reloc_symbol_info {
char name[RELOC_FUNC_NAME_SIZE];
unsigned int count;
unsigned int offsets[]; /* array size == count */
};
#endif
enum section_type {
SECTION_RX = 0,
SECTION_RW,
SECTION_RO,
SECTION_NR,
};
struct section_info {
unsigned int type;
unsigned int offset;
unsigned int size;
unsigned int page;
};
#define PATCH_ATTR_ADAPTIVE 0
#define PATCH_ATTR_PRECISE 1
#define PATCH_ATTR_ARM32 0
#define PATCH_ATTR_ARM64 1
struct oases_patch_header {
char magic[PATCH_MAGIC_SIZE];
unsigned int checksum;
/* uniq vendor id */
char id[PATCH_ID_LEN];
/* name of the vuln */
char vulnname[PATCH_NAME_LEN];
unsigned int oases_version;
unsigned int patch_version;
unsigned int header_size;
unsigned int patch_size;
unsigned int reset_data_count; /* the count of reset datas with (base addres + &offset) */
unsigned int reset_data_offset;
unsigned int reloc_func_count; /* relocation api function count */
unsigned int reloc_func_offset;
unsigned int section_info_offset;
unsigned int code_size;
unsigned int code_offset;
unsigned int code_entry_offset; /* code entry offset, base is code_body*/
/* attr, PATCH_ATTR_XXX
+------------------------------+-------------------+
| precise_patch(4 bits) | arch(4 bits) |
+------------------------------+-------------------+
| 0000(adaptive) 0001(precise) | 0000(32) 0001(64) |
+------------------------------+-------------------+
*/
unsigned int attr;
#if OASES_ENABLE_PRECISE_PATCH
unsigned int reloc_symbol_count;
unsigned int reloc_symbol_offset;
#else
unsigned int padding2;
unsigned int padding3;
#endif
unsigned int padding4;
};
/*
* Layout of patch file:
* +--------------------------------------------------------------+
* | struct oases_patch_header |
* +--------------------------------------------------------------+
* | reset_data_count * sizeof(int) |
* +--------------------------------------------------------------+
* | reloc_func_count * sizeof(reloc_function_info) |
* +--------------------------------------------------------------+
* | SECTION_NR * sizeof(section_info) |
* +--------------------------------------------------------------+
* | OPTIONAL reloc_symbol_count * sizeof(reloc_symbol_info) |
* +--------------------------------------------------------------+
* | code RX in bytes, size indicated by section_info |
* | data RW |
* | data RO |
* +--------------------------------------------------------------+
*/
struct oases_patch_file {
struct oases_patch_header *pheader;
unsigned int *redatas; /* unsinged int[reset_data_count] */
struct reloc_function_info *relfuncs;
struct section_info *sections;
#if OASES_ENABLE_PRECISE_PATCH
struct reloc_symbol_info *relsymbols;
#endif
char *codes;
unsigned long len; /* patch length */
unsigned int code_size;
};
int oases_init_patch_file(struct oases_patch_file *pfile, void *data);
int oases_layout_patch_file(struct oases_patch_file *pfile, char *data);
int oases_build_code(struct oases_patch_info *info, struct oases_patch_file *pfile);
#endif/* _OASES_PATCH_H */