-
-
Notifications
You must be signed in to change notification settings - Fork 289
/
core-asm-ret.c
83 lines (78 loc) · 2.89 KB
/
core-asm-ret.c
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
/*
* Copyright (C) 2022-2024 Colin Ian King.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "stress-ng.h"
#include "core-arch.h"
#include "core-asm-ret.h"
#if defined(__BYTE_ORDER__) && \
defined(__ORDER_LITTLE_ENDIAN__)
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define STRESS_ARCH_LE
#endif
#endif
#if defined(__BYTE_ORDER__) && \
defined(__ORDER_BIG_ENDIAN__)
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define STRESS_ARCH_BE
#endif
#endif
const stress_ret_opcode_t stress_ret_opcode =
#if defined(STRESS_ARCH_ALPHA)
{ 4, 4, "ret", { 0x01, 0x80, 0xfa, 0x6b } };
#elif defined(STRESS_ARCH_ARM) && defined(__aarch64__)
{ 4, 4, "ret", { 0xc0, 0x03, 0x5f, 0xd6 } };
#elif defined(STRESS_ARCH_HPPA)
{ 8, 8, "bv,n r0(rp); nop", { 0xe8, 0x40, 0xc0, 0x02, 0x08, 0x00, 0x02, 0x40 } };
#elif defined(STRESS_ARCH_LOONG64) && defined(STRESS_ARCH_LE)
{ 4, 4, "ret", { 0x20, 0x00, 0x00, 0x4c } };
#elif defined(STRESS_ARCH_LOONG64) && defined(STRESS_ARCH_BE)
{ 4, 4, "ret", { 0x4c, 0x00, 0x00, 0x20 } };
#elif defined(STRESS_ARCH_M68K)
{ 2, 2, "rts", { 0x4e, 0x75 } };
#elif defined(STRESS_ARCH_MIPS) && defined(STRESS_ARCH_LE)
{ 8, 8, "jr ra; nop", { 0x08, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00 } };
#elif defined(STRESS_ARCH_MIPS) && defined(STRESS_ARCH_BE)
{ 8, 8, "jr ra; nop", { 0x03, 0xe0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00 } };
#elif defined(STRESS_ARCH_PPC64) && defined(STRESS_ARCH_LE)
{ 8, 8, "blr; nop", { 0x20, 0x00, 0x80, 0x4e, 0x00, 0x00, 0x00, 0x60 } };
#elif defined(STRESS_ARCH_RISCV)
{ 2, 2, "ret", { 0x82, 0x080 } };
#elif defined(STRESS_ARCH_S390)
{ 2, 2, "br %r14", { 0x07, 0xfe } };
#elif defined(STRESS_ARCH_SH4)
{ 4, 4, "rts; nop", { 0x0b, 0x00, 0x09, 0x00 } };
#elif defined(STRESS_ARCH_SPARC)
{ 8, 8, "retl; add %o7, %l7, %l7", { 0x81, 0xc3, 0xe0, 0x08, 0xae, 0x03, 0xc0, 0x17 } };
#elif defined(STRESS_ARCH_X86)
{ 1, 1, "ret", { 0xc3 } };
#else
{ 0, 0, "", { 0x00 } };
#endif
/*
* stress_asm_ret_supported()
* check if assembler return instruction is supported by stress-ng
*/
int stress_asm_ret_supported(const char *name)
{
char tmp[64];
if (stress_ret_opcode.len > 0)
return 0;
stress_munge_underscore(tmp, name, sizeof(tmp));
pr_inf("%s: architecture not supported\n", tmp);
return -1;
}