/*
 * Copyright (C) 2022 Huawei Technologies Co., Ltd.
 * Licensed under the Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *     http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
 * PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#ifndef _TC_NS_CLIENT_H_
#define _TC_NS_CLIENT_H_
#include "tee_client_type.h"
#include "tee_ioctl_cmd.h"

#ifndef ZERO_SIZE_PTR
#define ZERO_SIZE_PTR       ((void *)16)
#define ZERO_OR_NULL_PTR(x) ((unsigned long)(x) <= (unsigned long)ZERO_SIZE_PTR)
#endif

#define UUID_SIZE      16

#define TC_NS_CLIENT_IOC_MAGIC 't'
#define TC_NS_CLIENT_DEV       "tc_ns_client"
#define TC_NS_CLIENT_DEV_NAME  "/dev/tc_ns_client"
#define TC_PRIVATE_DEV_NAME  "/dev/tc_private"
#define TUI_LISTEN_PATH "/sys/kernel/tui/c_state"

enum ConnectCmd {
    GET_FD,
    GET_TEEVERSION,
};
typedef struct {
    unsigned int method;
    unsigned int mdata;
} TC_NS_ClientLogin;

typedef union {
    struct {
        unsigned int buffer;
        unsigned int buffer_h_addr;
        unsigned int offset;
        unsigned int h_offset;
        unsigned int size_addr;
        unsigned int size_h_addr;
    } memref;
    struct {
        unsigned int a_addr;
        unsigned int a_h_addr;
        unsigned int b_addr;
        unsigned int b_h_addr;
    } value;
} TC_NS_ClientParam;

typedef struct {
    unsigned int code;
    unsigned int origin;
} TC_NS_ClientReturn;

typedef struct {
    unsigned char uuid[UUID_SIZE];
    unsigned int session_id;
    unsigned int cmd_id;
    TC_NS_ClientReturn returns;
    TC_NS_ClientLogin login;
    TC_NS_ClientParam params[TEEC_PARAM_NUM];
    unsigned int paramTypes;
    bool started;
    unsigned int callingPid;
    unsigned int file_size;
    union {
        char *file_buffer;
        unsigned long long file_addr;
    };
} TC_NS_ClientContext;

typedef struct {
    uint32_t seconds;
    uint32_t millis;
} TC_NS_Time;

enum SecFileType {
    LOAD_TA = 0,
    LOAD_SERVICE,
    LOAD_LIB,
    LOAD_DYNAMIC_DRV,
};

struct SecFileInfo {
    enum SecFileType fileType;
    uint32_t fileSize;
    int32_t secLoadErr;
};
struct SecLoadIoctlStruct {
    struct SecFileInfo secFileInfo;
    TEEC_UUID uuid;
    union {
        char *fileBuffer;
        struct {
            uint32_t file_addr;
            uint32_t file_h_addr;
        } memref;
    };
}__attribute__((packed));

struct AgentIoctlArgs {
    uint32_t id;
    uint32_t bufferSize;
    union {
        void *buffer;
        unsigned long long addr;
    };
};

#endif