18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci#include <limits.h> 38c2ecf20Sopenharmony_ci#include <stdio.h> 48c2ecf20Sopenharmony_ci#include <stdlib.h> 58c2ecf20Sopenharmony_ci#include <string.h> 68c2ecf20Sopenharmony_ci#include <unistd.h> 78c2ecf20Sopenharmony_ci#include <linux/compiler.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include "debug.h" 108c2ecf20Sopenharmony_ci#include "tests.h" 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#ifdef HAVE_JITDUMP 138c2ecf20Sopenharmony_ci#include <libelf.h> 148c2ecf20Sopenharmony_ci#include "../util/genelf.h" 158c2ecf20Sopenharmony_ci#endif 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define TEMPL "/tmp/perf-test-XXXXXX" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciint test__jit_write_elf(struct test *test __maybe_unused, 208c2ecf20Sopenharmony_ci int subtest __maybe_unused) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci#ifdef HAVE_JITDUMP 238c2ecf20Sopenharmony_ci static unsigned char x86_code[] = { 248c2ecf20Sopenharmony_ci 0xBB, 0x2A, 0x00, 0x00, 0x00, /* movl $42, %ebx */ 258c2ecf20Sopenharmony_ci 0xB8, 0x01, 0x00, 0x00, 0x00, /* movl $1, %eax */ 268c2ecf20Sopenharmony_ci 0xCD, 0x80 /* int $0x80 */ 278c2ecf20Sopenharmony_ci }; 288c2ecf20Sopenharmony_ci char path[PATH_MAX]; 298c2ecf20Sopenharmony_ci int fd, ret; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci strcpy(path, TEMPL); 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci fd = mkstemp(path); 348c2ecf20Sopenharmony_ci if (fd < 0) { 358c2ecf20Sopenharmony_ci perror("mkstemp failed"); 368c2ecf20Sopenharmony_ci return TEST_FAIL; 378c2ecf20Sopenharmony_ci } 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci pr_info("Writing jit code to: %s\n", path); 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci ret = jit_write_elf(fd, 0, "main", x86_code, sizeof(x86_code), 428c2ecf20Sopenharmony_ci NULL, 0, NULL, 0, 0); 438c2ecf20Sopenharmony_ci close(fd); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci unlink(path); 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci return ret ? TEST_FAIL : 0; 488c2ecf20Sopenharmony_ci#else 498c2ecf20Sopenharmony_ci return TEST_SKIP; 508c2ecf20Sopenharmony_ci#endif 518c2ecf20Sopenharmony_ci} 52