ptrace.h 4.2 KB
Newer Older
J
Jiaxun Yang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
/*
 * Copyright (c) 2006-2019, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2019-12-04     Jiaxun Yang  Initial version
 */

#ifndef _MIPS_PTRACE_H
#define _MIPS_PTRACE_H

#include "asm.h"
#include "mips_regs.h"

#define FP_REG_SIZE 8
#define NUM_FPU_REGS 16

#ifndef __ASSEMBLY__
#include <rtthread.h>

struct mips_fpu_struct {
    rt_uint64_t	fpr[NUM_FPU_REGS];
    rt_uint32_t	fcr31;
    rt_uint32_t	pad;
};

struct pt_regs {
    /* Only O32 Need This! */
    /* Pad bytes for argument save space on the stack. */
    rt_uint32_t pad0[8];

    /* Saved main processor registers. */
    rt_uint32_t regs[32];

    /* Saved special registers. */
    rt_uint32_t cp0_status;
    rt_uint32_t hi;
    rt_uint32_t lo;
    rt_uint32_t cp0_badvaddr;
    rt_uint32_t cp0_cause;
    rt_uint32_t cp0_epc;

#ifdef RT_USING_FPU
    /* FPU Registers */
    /* Unlike Linux Kernel, we save these registers unconditionally,
     * so it should be a part of pt_regs */
    struct mips_fpu_struct fpu;
#endif
} __aligned(8);
#endif

/* Note: For call stack o32 ABI has 0x8 shadowsoace Here  */
#define PT_R0		(0x8 * LONGSIZE)	/* 0 */
#define PT_R1		((PT_R0) + LONGSIZE)	/* 1 */
#define PT_R2		((PT_R1) + LONGSIZE)	/* 2 */
#define PT_R3		((PT_R2) + LONGSIZE)	/* 3 */
#define PT_R4		((PT_R3) + LONGSIZE)	/* 4 */
#define PT_R5		((PT_R4) + LONGSIZE)	/* 5 */
#define PT_R6		((PT_R5) + LONGSIZE)	/* 6 */
#define PT_R7		((PT_R6) + LONGSIZE)	/* 7 */
#define PT_R8		((PT_R7) + LONGSIZE)	/* 8 */
#define PT_R9		((PT_R8) + LONGSIZE)	/* 9 */
#define PT_R10		((PT_R9) + LONGSIZE)	/* 10 */
#define PT_R11		((PT_R10) + LONGSIZE)	/* 11 */
#define PT_R12		((PT_R11) + LONGSIZE)	/* 12 */
#define PT_R13		((PT_R12) + LONGSIZE)	/* 13 */
#define PT_R14		((PT_R13) + LONGSIZE)	/* 14 */
#define PT_R15		((PT_R14) + LONGSIZE)	/* 15 */
#define PT_R16		((PT_R15) + LONGSIZE)	/* 16 */
#define PT_R17		((PT_R16) + LONGSIZE)	/* 17 */
#define PT_R18		((PT_R17) + LONGSIZE)	/* 18 */
#define PT_R19		((PT_R18) + LONGSIZE)	/* 19 */
#define PT_R20		((PT_R19) + LONGSIZE)	/* 20 */
#define PT_R21		((PT_R20) + LONGSIZE)	/* 21 */
#define PT_R22		((PT_R21) + LONGSIZE)	/* 22 */
#define PT_R23		((PT_R22) + LONGSIZE)	/* 23 */
#define PT_R24		((PT_R23) + LONGSIZE)	/* 24 */
#define PT_R25		((PT_R24) + LONGSIZE)	/* 25 */
#define PT_R26		((PT_R25) + LONGSIZE)	/* 26 */
#define PT_R27		((PT_R26) + LONGSIZE)	/* 27 */
#define PT_R28		((PT_R27) + LONGSIZE)	/* 28 */
#define PT_R29		((PT_R28) + LONGSIZE)	/* 29 */
#define PT_R30		((PT_R29) + LONGSIZE)	/* 30 */
#define PT_R31		((PT_R30) + LONGSIZE)	/* 31 */

/*
 * Saved special registers
 */
#define PT_STATUS	((PT_R31) + LONGSIZE)	/* 32 */
#define PT_HI		((PT_STATUS) + LONGSIZE)	/* 33 */
#define PT_LO		((PT_HI) + LONGSIZE)	/* 34 */
#define PT_BADVADDR	((PT_LO) + LONGSIZE)	/* 35 */
#define PT_CAUSE	((PT_BADVADDR) + LONGSIZE)	/* 36 */
#define PT_EPC		((PT_CAUSE) + LONGSIZE)	/* 37 */

#define PT_REG_END		((PT_EPC) + LONGSIZE) /* Align already ensured manually */

#ifdef RT_USING_FPU
#define PT_FPU_R0               (PT_REG_END)
#define PT_FPU_R2               ((PT_FPU_R0) + FP_REG_SIZE)
#define PT_FPU_R4               ((PT_FPU_R2) + FP_REG_SIZE)
#define PT_FPU_R6               ((PT_FPU_R4) + FP_REG_SIZE)
#define PT_FPU_R8               ((PT_FPU_R6) + FP_REG_SIZE)
#define PT_FPU_R10              ((PT_FPU_R8) + FP_REG_SIZE)
#define PT_FPU_R12              ((PT_FPU_R10) + FP_REG_SIZE)
#define PT_FPU_R14              ((PT_FPU_R12) + FP_REG_SIZE)
#define PT_FPU_R16              ((PT_FPU_R14) + FP_REG_SIZE)
#define PT_FPU_R18              ((PT_FPU_R16) + FP_REG_SIZE)
#define PT_FPU_R20              ((PT_FPU_R18) + FP_REG_SIZE)
#define PT_FPU_R22              ((PT_FPU_R20) + FP_REG_SIZE)
#define PT_FPU_R24              ((PT_FPU_R22) + FP_REG_SIZE)
#define PT_FPU_R26              ((PT_FPU_R24) + FP_REG_SIZE)
#define PT_FPU_R28              ((PT_FPU_R26) + FP_REG_SIZE)
#define PT_FPU_R30              ((PT_FPU_R28) + FP_REG_SIZE)
#define PT_FPU_FCSR31           ((PT_FPU_R30) + FP_REG_SIZE)
#define PT_FPU_PAD0             ((PT_FPU_FCSR31) + LONGSIZE)

#define PT_FPU_END     	        ((PT_FPU_PAD0) + LONGSIZE)
#define PT_SIZE			PT_FPU_END
#else
#define PT_SIZE			PT_REG_END
#endif

#endif