/**
 * @file       gaf.h
 * @brief      Get GAF forensic info structure in kernel space for driver
 * @author     Viacheslav Vovchenko (v.vovchenko@samsung.com)
 * @version    1.0
 * @date       Created Jun 30, 2016
 * @copyright  In Samsung Ukraine R&D Center (SURC) under a contract between
 * @copyright  LLC "Samsung Electronics Ukraine Company" (Kiev, Ukraine) and
 * @copyright  "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
 * @copyright  Copyright: (c) Samsung Electronics Co, Ltd 2016. All rights reserved.
**/

#ifndef PA_TZ_DRV_SRC_GAF_H_
#define PA_TZ_DRV_SRC_GAF_H_

#include "memory.h"

// Copy from security/proca/gaf/gaf_v6.c
typedef struct {
    unsigned short ver;
    unsigned int size;
    unsigned short task_struct_struct_state;
    unsigned short task_struct_struct_comm;
    unsigned short task_struct_struct_tasks;
    unsigned short task_struct_struct_pid;
    unsigned short task_struct_struct_mm;
    unsigned short mm_struct_struct_pgd;
    unsigned short mm_struct_struct_mmap;
    unsigned short mm_struct_struct_mm_rb;
    unsigned short vm_area_struct_struct_vm_start;
    unsigned short vm_area_struct_struct_vm_end;
    unsigned short vm_area_struct_struct_vm_next;
    unsigned short vm_area_struct_struct_vm_flags;
    unsigned short vm_area_struct_struct_vm_file;
    unsigned short vm_area_struct_struct_vm_rb;
    unsigned short file_struct_f_path;
    unsigned short path_struct_mnt;
    unsigned short path_struct_dentry;
    unsigned short dentry_struct_d_parent;
    unsigned short dentry_struct_d_name;
    unsigned short qstr_struct_name;
    unsigned short qstr_struct_len;
    unsigned short struct_mount_mnt_mountpoint;
    unsigned short struct_mount_mnt;
    unsigned short struct_mount_mnt_parent;
    unsigned short list_head_struct_next;
    unsigned short list_head_struct_prev;
    unsigned short is_kdp_ns_on;
    unsigned short task_struct_integrity;
    unsigned short proca_task_descr_task;
    unsigned short proca_task_descr_proca_identity;
    unsigned short proca_task_descr_pid_map_node;
    unsigned short proca_task_descr_app_name_map_node;
    unsigned short proca_identity_struct_certificate;
    unsigned short proca_identity_struct_certificate_size;
	unsigned short proca_identity_struct_parsed_cert;
    unsigned short proca_identity_struct_file;
    unsigned short file_struct_f_signature;
	unsigned short proca_table_hash_tables_shift;
	unsigned short proca_table_pid_map;
	unsigned short proca_table_app_name_map;
    unsigned short proca_certificate_struct_app_name;
    unsigned short proca_certificate_struct_app_name_size;
    unsigned short hlist_node_struct_next;
    unsigned short struct_vfsmount_bp_mount;
    char reserved[1022];
    unsigned short GAFINFOCheckSum;
} GafInfo;

/**
 * @brief Load and parse Gaf structure start from virtual address.
 * @param [in] gaf_virt Virtual address where is located Gaf structure
 * @param [out] gaf Output GAF structure
 * @return ::PA_TZ_SUCCESS in case of success, ::PA_TZ_GENERAL_ERROR
 */
PaTzResult LoadGafInfo(KernelAddress gaf_virt, GafInfo *gaf);

#endif  // PA_TZ_DRV_SRC_GAF_H_
