拓展之crash-gcore ,github源码
资源内容介绍
拓展crash-gcore,csdn源码 /* x86.c -- core analysis suite * * Copyright (C) 2010-2023 Fujitsu Limited * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */#if defined(X86) || defined(X86_64)#include "defs.h"#include <gcore_defs.h>#include <stdint.h>#include <elf.h>#include <asm/ldt.h>#undef MIN#define MIN(X,Y) (((X) < (Y)) ? (X) : (Y))struct gcore_x86_table{#ifdef X86_64ulong (*get_old_rsp)(int cpu);ulong (*user_stack_pointer)(struct task_context *tc);#endifulong (*get_thread_struct_fpu)(struct task_context *tc);ulong (*get_thread_struct_fpu_size)(void);#ifdef X86_64int (*is_special_syscall)(int nr_syscall);int (*is_special_ia32_syscall)(int nr_syscall);#endifint (*tsk_used_math)(ulong task);};static struct gcore_x86_table gcore_x86_table;struct gcore_x86_table *gxt = &gcore_x86_table;static void gdb_run_command(char *cmd, char *buf, size_t size);static int get_vsyscall_mode_none(void);#ifdef X86_64static ulong gcore_x86_64_get_old_rsp(int cpu);static ulong gcore_x86_64_get_per_cpu__old_rsp(int cpu);static ulong gcore_x86_64_get_cpu_pda_oldrsp(int cpu);static ulong gcore_x86_64_get_cpu__pda_oldrsp(int cpu);static ulong gcore_x86_64_user_stack_pointer_userrsp(struct task_context *tc);static ulong gcore_x86_64_user_stack_pointer_pt_regs(struct task_context *tc);#endifstatic ulonggcore_x86_get_thread_struct_fpu_fpregs_state(struct task_context *tc);static ulonggcore_x86_get_thread_struct_fpu_thread_xstate(struct task_context *tc);static ulong gcore_x86_get_thread_struct_fpu_thread_xstate_size(void);static ulonggcore_x86_get_thread_struct_thread_xstate(struct task_context *tc);static ulong gcore_x86_get_thread_struct_thread_xstate_size(void);static ulong gcore_x86_get_thread_struct_i387(struct task_context *tc);static ulong gcore_x86_get_thread_struct_i387_size(void);#ifdef X86_64static void gcore_x86_table_register_get_old_rsp(void);#endifstatic void gcore_x86_table_register_get_thread_struct_fpu(void);#ifdef X86_64static void gcore_x86_table_register_is_special_syscall(void);static void gcore_x86_table_register_is_special_ia32_syscall(void);#endifstatic void gcore_x86_table_register_tsk_used_math(void);#ifdef X86_64static int is_special_syscall_v0(int nr_syscall);static int is_special_syscall_v26(int nr_syscall);#endifstatic int test_bit(unsigned int nr, const ulong addr);#ifdef X86_64static int is_ia32_syscall_enabled(void);static int is_special_ia32_syscall_v0(int nr_syscall);static int is_special_ia32_syscall_v26(int nr_syscall);#endifstatic int tsk_used_math_v0(ulong task);static int tsk_used_math_v11(ulong task);static int tsk_used_math_v4_14(ulong task);#ifdef X86_64static void gcore_x86_64_regset_xstate_init(void);#endifstatic int genregs_get32(struct task_context *target, const struct user_regset *regset, unsigned int size, void *buf);#ifdef X86static void gcore_x86_32_regset_xstate_init(void);#endifstatic int get_xstate_regsets_number(void);enum gcore_regset {REGSET_GENERAL,REGSET_FP,REGSET_XFP,REGSET_IOPERM64 = REGSET_XFP,REGSET_TLS,REGSET_IOPERM32,REGSET_XSTATE,};#define NT_386_TLS 0x200 #ifndef NT_386_IOPERM#define NT_386_IOPERM0x201#endif#define NT_X86_XSTATE 0x202 #define NT_PRXFPREG 0x46e62b7f #define USER_XSTATE_FX_SW_WORDS 6#define MXCSR_DEFAULT 0x1f80#ifdef X86_64 struct user_i387_struct {unsigned shortcwd;unsigned shortswd;unsigned shorttwd; unsigned shortfop;uint64_trip;uint64_trdp;uint32_tmxcsr;uint32_tmxcsr_mask;uint32_tst_space[32];/* 8*16 bytes for each FP-reg = 128 bytes */uint32_txmm_space[64];/* 16*16 bytes for each XMM-reg = 256 bytes */uint32_tpadding[24];};#endifstruct user_i387_ia32_struct {uint32_tcwd;uint32_tswd;uint32_ttwd;uint32_tfip;uint32_tfcs;uint32_tfoo;uint32_tfos;uint32_tst_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */};struct user32_fxsr_struct {unsigned shortcwd;unsigned shortswd;unsigned shorttwd;unsigned shortfop;intfip;intfcs;intfoo;intfos;intmxcsr;intreserved;intst_space[32];/* 8*16 bytes for each FP-reg = 128 bytes */intxmm_space[32];/* 8*16 bytes for each XMM-reg = 128 bytes */intpadding[56];};struct i387_fsave_struct { uint32_t cwd; uint32_t swd; uint32_t twd; uint32_t fip; uint32_t fcs; uint32_t foo; uint32_t fos; /* 8*10 bytes for each FP-reg = 80 bytes: */ uint32_t st_space[20]; uint32_t status;};struct i387_fxsave_struct { uint16_t cwd; uint16_t swd; uint16_t twd; uint16_t fop; union { struct { uint64_t rip; uint64_t rdp; }; struct { uint32_t fip; uint32_t fcs; uint32_t foo; uint32_t fos; }; }; uint32_t mxcsr; uint32_t mxcsr_mask; /* 8*16 bytes for each FP-reg = 128 bytes: */ uint32_t st_space[32]; /* 16*16 bytes for each XMM-reg = 256 bytes: */ uint32_t xmm_space[64]; uint32_t padding[12]; union { uint32_t padding1[12]; uint32_t sw_reserved[12]; };} __attribute__((aligned(16)));struct i387_soft_struct { uint32_t cwd; uint32_t swd; uint32_t twd; uint32_t fip; uint32_t fcs; uint32_t foo; uint32_t fos; /* 8*10 bytes for each FP-reg = 80 bytes: