#ifndef _DBGPROTO_H__
#define _DBGPROTO_H__

#include "dbgdefs.h"

#define KK_REV 2

#define KK_CODE_THREAD_STATUS 4

#define KK_TYPE_REQUEST      0
#define KK_TYPE_REPLY        1
#define KK_TYPE_EXCEPTION    2
#define KK_TYPE_THREAD_EXIT  3
#define KK_TYPE_PROCESS_EXIT 4
#define KK_TYPE_CONSOLE      5

#define TV_ERROR_NO_ERROR               0
#define TV_ERROR_ILLEGAL_CALL           -1
#define TV_ERROR_INVALID_ID             -2
#define TV_ERROR_INVALID_TYPE           -3
#define TV_ERROR_OPERATIONS_PROTECTED   -4
#define TV_ERROR_INVALID_ADDRESS        -5
#define TV_ERROR_INVALID_PRIORITY       -6
#define TV_ERROR_INVALID_FLAGS          -7
#define TV_ERROR_INVALID_CAPABILITY     -8
#define TV_ERROR_NO_HANDLER             -9
#define TV_ERROR_NO_MORE_IDS            -10
#define TV_ERROR_NO_MORE_MESSAGES       -11
#define TV_ERROR_NO_MORE_PROCESSES      -12
#define TV_ERROR_NO_MORE_THREADS        -13
#define TV_ERROR_NO_MORE_REGIONS        -14
#define TV_ERROR_NO_MORE_TIMERS         -15
#define TV_ERROR_NO_MORE_LOCKS          -16
#define TV_ERROR_NO_MORE_QUEUES         -17
#define TV_ERROR_NO_MORE_SETS           -18
#define TV_ERROR_NO_MORE_MEMORY         -19
#define TV_ERROR_NOT_LOCKED             -20

typedef struct __KKTimeStruct {
    long seconds;
    long nanoseconds;
} KKTimeStruct;

typedef struct __KKObjsStruct {
    TVushort number;
    TVid objects[1];
} KKObjs;

typedef struct __KKFaultInfoStruct {
    unsigned int addr;
    short major;
    short minor;
} KKFaultInfo;

typedef struct __KKThreadStatusStruct {
    int flags;
    short why;
    short what;
    TVid tid;
    TVid pid;
    unsigned int instr;
    KKFaultInfo info;
    int priority;
    int start;
    int rv;
    unsigned int args[6];
} KKThreadStatus;

#define KK_RUN_SSTEP (1 << 0)
#define KK_RUN_SETPC (1 << 1)

typedef struct __KKRunStruct {
    int flags;
    unsigned int vaddr;
} KKRun;

typedef struct __KKFaultStruct {
    short majorMask;
    short minorMask;
} KKFault;

typedef struct __KKRegionStruct {
    unsigned int vaddr;
    unsigned int size;
    short flags;
    unsigned int paddr;
} KKRegion;

typedef struct __KKGregSetStruct {
    unsigned int gregs[37];
} KKGregSet;

typedef struct __KKFPregSetStruct {
    union {
        double dregs[16];
        float fregs[32];
        unsigned int regs[32];
    } fpregs;
    unsigned int fpcsr;
    unsigned int fppad;
} KKFPregSet;

typedef struct __KKRegisterContextStruct {
    KKGregSet gregs;
    KKFPregSet fpregs;
} KKRegisterContext;

typedef struct __KKCpScalarSetStruct {
    unsigned int sregs[40];
} KKCpScalarRegSet;

typedef struct __KKCpVectorSetStruct {
    unsigned int vregs[128];
} KKCpVectorRegSet;

typedef struct __KKCpRegisterContextStruct {
    KKCpScalarRegSet sregs;
    KKCpVectorRegSet vregs;
} KKCpRegisterContext;

typedef struct __KKUsageStruct {
    KKTimeStruct tstamp;
    KKTimeStruct created;
    KKTimeStruct states[10];
} KKUsage;

typedef struct __KKLogEventSetStruct {
    int from;
    int to;
} KKLogEventSet;

typedef struct __KKLogStatusStruct {
    int bufferType;
    int bufferSize;
    int dataSize;
    int logState;
    int flushLimit;
} KKLogStatus;

typedef struct __KKProcUsageStruct {
    TVid pid;
    KKTimeStruct states[10];
} KKProcUsage;

typedef struct __KKHeaderStruct {
    int length;
    char code;
    char type;
    short error;
    char rev;
    char method;
    short notused2;
} KKHeader;

typedef struct __KKGetFrameRequestStruct {
    KKHeader header;
    int height;
    int width;
    int which;
} KKGetFrameRequest;

typedef struct __KKLoadExecutableRequestStruct {
    KKHeader header;
    char str[1];
} KKLoadExecutableRequest;

typedef struct __KKObjectRequestStruct {
    KKHeader header;
    TVid object;
} KKObjectRequest;

typedef struct __KKRunThreadRequestStruct {
    KKHeader header;
    TVid tid;
    KKRun actions;
} KKRunThreadRequest;

typedef struct __KKFaultRequestStruct {
    KKHeader header;
    TVid tid;
    KKFault fault;
    TVuchar stopAllThreads;
} KKFaultRequest;

typedef struct __KKGRegsetRequestStruct {
    KKHeader header;
    TVid tid;
    KKGregSet registers;
} KKGRegsetRequest;

typedef struct __KKFPRegsetRequestStruct {
    KKHeader header;
    TVid tid;
    KKFPregSet registers;
} KKFPRegsetRequest;

typedef struct __KKCpScalarRegsetRequestStruct {
    KKHeader header;
    TVid tid;
    KKCpScalarRegSet registers;
} KKCpScalarRegsetRequest;

typedef struct __KKCpVectorRegsetRequestStruct {
    KKHeader header;
    TVid tid;
    KKCpVectorRegSet registers;
} KKCpVectorRegsetRequest;

typedef struct __KKReadRequestStruct {
    KKHeader header;
    TVid object;
    unsigned int addr;
    unsigned int nbytes;
} KKReadRequest;

typedef struct __KKWriteHeaderStruct {
    KKHeader header;
    TVid object;
    unsigned int addr;
    unsigned int nbytes;
} KKWriteHeader;

typedef struct __KKWriteRequestStruct {
    KKWriteHeader writeHeader;
    char buffer[1];
} KKWriteRequest;

typedef struct __KKSetBkptRequestStruct {
    KKHeader header;
    TVid object;
    unsigned int addr;
} KKSetBkptRequest;

typedef struct __KKClrBkptRequestStruct {
    KKHeader header;
    TVid object;
    TVid bp;
} KKClrBkptRequest;

typedef struct __KKWatchRequestStruct {
    KKHeader header;
    TVid object;
    unsigned int number;
    KKRegion wp[1];
} KKWatchRequest;

typedef struct __KKSetCommRequestStruct {
    KKHeader header;
    unsigned int how;
    unsigned int addr;
} KKSetCommRequest;

typedef struct __KKSysCallSetStruct {
    unsigned int word[8];
} KKSysCallSet;

typedef struct __KKSysCallRequestStruct {
    KKHeader header;
    TVid pid;
    KKSysCallSet syscallset;
} KKSysCallRequest;

typedef struct __KKLogEventRequestStruct {
    KKHeader header;
    unsigned int numSet;
    KKLogEventSet set[1];
} KKLogEventRequest;

typedef struct __KKNewLogRequestStruct {
    KKHeader header;
    char str[1];
} KKNewLogRequest;

typedef struct __KKRemoteRequestStruct {
    KKHeader header;
    int len;
    char buf[16];
} KKRemoteRequest;

typedef struct __KKFlushLogRequestStruct {
    KKHeader header;
    int no_block;
} KKFlushLogRequest;

typedef struct __KKLogControlRequestStruct {
    KKHeader header;
    int command;
    int arg;
} KKLogControlRequest;

typedef struct __KKSetTrptRequestStruct {
    KKSetBkptRequest bpRequest;
    unsigned short code;
} KKSetTrptRequest;

typedef KKClrBkptRequest KKClrTrptRequest;

typedef struct __KKObjectEventStruct {
    KKHeader header;
    TVid object;
} KKObjectEvent;

typedef struct __KKObjsEventStruct {
    KKHeader header;
    TVid object;
    KKObjs objs;
} KKObjsEvent;

typedef struct __KKBufferEventStruct {
    KKHeader header;
    TVid object;
    char buffer[1];
} KKBufferEvent;

typedef struct __KKStatusEventStruct {
    KKHeader header;
    KKThreadStatus status;
} KKStatusEvent;

typedef struct __KKFaultEventStruct {
    KKHeader header;
    TVid tid;
    KKFault fault;
    TVuchar stopAllThreads;
} KKFaultEvent;

typedef struct __KKNumberEventStruct {
    KKHeader header;
    TVid object;
    unsigned int number;
} KKNumberEvent;

typedef struct __KKRegionEventStruct {
    KKHeader header;
    TVid object;
    unsigned int number;
    KKRegion regions[1];
} KKRegionEvent;

typedef struct __KKGregEventStruct {
    KKHeader header;
    TVid tid;
    KKGregSet registers;
} KKGregEvent;

typedef struct __KKFPregEventStruct {
    KKHeader header;
    TVid tid;
    KKFPregSet registers;
} KKFPregEvent;

typedef struct __KKCpSregEventStruct {
    KKHeader header;
    TVid tid;
    KKCpScalarRegSet registers;
} KKCpSregEvent;

typedef struct __KKCpVregEventStruct {
    KKHeader header;
    TVid tid;
    KKCpVectorRegSet registers;
} KKCpVregEvent;

typedef struct __KKBkptEventStruct {
    KKHeader header;
    TVid object;
    TVid bp;
    unsigned int instruction;
} KKBkptEvent;

typedef struct __KKUsageEventStruct {
    KKHeader header;
    TVid tid;
    KKUsage usage;
} KKUsageEvent;

typedef struct __KKFlushEventStruct {
    KKHeader header;
    int bufferType;
    char buffer[1];
} KKFlushEvent;

typedef struct __KKLogStatusEventStruct {
    KKHeader header;
    KKLogStatus status;
} KKLogStatusEvent;

typedef struct __KKSysUsageEventStruct {
    KKHeader header;
    KKTimeStruct tstamp;
    int numProc;
    KKProcUsage usage[1];
} KKSysUsageEvent;

typedef struct __KKStringEventStruct {
    KKHeader header;
    char str[1];
} KKStringEvent;

typedef KKSysCallRequest KKSysCallEvent;

#endif