Commit 17ea375c authored by Mao Minkai's avatar Mao Minkai Committed by guzitao
Browse files

sw64: fix ftrace support

Sunway inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8YR3H



--------------------------------

Modify scripts for SW64 ftrace support.

Signed-off-by: default avatarMao Minkai <maominkai@wxiat.com>
Reviewed-by: default avatarHe Sheng <hesheng@wxiat.com>
Signed-off-by: default avatarGu Zitao <guzitao@wxiat.com>
parent aa517943
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -52,6 +52,12 @@

#define R_AARCH64_CALL26	283

#ifndef EM_SW64
#define EM_SW64			0x9916
#define R_SW64_NONE		0
#define R_SW64_REFQUAD		2       /* Direct 64 bit */
#endif

static int fd_map;	/* File descriptor for file being modified. */
static int mmap_failed; /* Boolean flag. */
static char gpfx;	/* prefix for global symbol name (sometimes '_') */
@@ -326,6 +332,16 @@ static int make_nop_arm64(void *map, size_t const offset)
	return 0;
}

static unsigned char ideal_nop4_sw64[4] = {0x5f, 0x07, 0xff, 0x43};

static int make_nop_sw64(void *map, size_t const offset)
{
	/* Convert to nop */
	ulseek(offset, SEEK_SET);
	uwrite(ideal_nop, 4);
	return 0;
}

static int write_file(const char *fname)
{
	char tmp_file[strlen(fname) + 4];
@@ -475,6 +491,21 @@ static int LARCH64_is_fake_mcount(Elf64_Rel const *rp)
	return 1;
}

#define SW64_FAKEMCOUNT_OFFSET	4

static int sw64_is_fake_mcount(Elf64_Rel const *rp)
{
	static Elf64_Addr old_r_offset = ~(Elf64_Addr)0;
	Elf64_Addr current_r_offset = _w(rp->r_offset);
	int is_fake;

	is_fake = (old_r_offset != ~(Elf64_Addr)0) &&
		(current_r_offset - old_r_offset == SW64_FAKEMCOUNT_OFFSET);
	old_r_offset = current_r_offset;

	return is_fake;
}

/* 64-bit EM_MIPS has weird ELF64_Rela.r_info.
 * http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf
 * We interpret Table 29 Relocation Operation (Elf64_Rel, Elf64_Rela) [p.40]
@@ -598,6 +629,14 @@ static int do_file(char const *const fname)
	case EM_S390:	/* reltype: e_class    */ break;
	case EM_SH:	reltype = R_SH_DIR32; gpfx = 0; break;
	case EM_SPARCV9: reltype = R_SPARC_64; break;
	case EM_SW64:
		reltype = R_SW64_REFQUAD;
		make_nop = make_nop_sw64;
		rel_type_nop = R_SW64_NONE;
		ideal_nop = ideal_nop4_sw64;
		mcount_adjust_64 = -12;
		is_fake_mcount64 = sw64_is_fake_mcount;
		break;
	case EM_X86_64:
		make_nop = make_nop_x86;
		ideal_nop = ideal_nop5_x86_64;