diff options
author | 2025-03-08 22:04:20 +0800 | |
---|---|---|
committer | 2025-03-08 22:04:20 +0800 | |
commit | a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a (patch) | |
tree | 84f21bd0bf7071bc5fc7dd989e77d7ceb5476682 /arch/mips/kernel/binfmt_elfn32.c | |
download | ohosKernel-a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a.tar.gz ohosKernel-a07bb8fd1299070229f0e8f3dcb57ffd5ef9870a.zip |
Initial commit: OpenHarmony-v4.0-ReleaseOpenHarmony-v4.0-Release
Diffstat (limited to 'arch/mips/kernel/binfmt_elfn32.c')
-rw-r--r-- | arch/mips/kernel/binfmt_elfn32.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/arch/mips/kernel/binfmt_elfn32.c b/arch/mips/kernel/binfmt_elfn32.c new file mode 100644 index 000000000..c4441416e --- /dev/null +++ b/arch/mips/kernel/binfmt_elfn32.c | |||
@@ -0,0 +1,113 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | ||
2 | /* | ||
3 | * Support for n32 Linux/MIPS ELF binaries. | ||
4 | * Author: Ralf Baechle (ralf@linux-mips.org) | ||
5 | * | ||
6 | * Copyright (C) 1999, 2001 Ralf Baechle | ||
7 | * Copyright (C) 1999, 2001 Silicon Graphics, Inc. | ||
8 | * | ||
9 | * Heavily inspired by the 32-bit Sparc compat code which is | ||
10 | * Copyright (C) 1995, 1996, 1997, 1998 David S. Miller (davem@redhat.com) | ||
11 | * Copyright (C) 1995, 1996, 1997, 1998 Jakub Jelinek (jj@ultra.linux.cz) | ||
12 | */ | ||
13 | |||
14 | #define ELF_ARCH EM_MIPS | ||
15 | #define ELF_CLASS ELFCLASS32 | ||
16 | #ifdef __MIPSEB__ | ||
17 | #define ELF_DATA ELFDATA2MSB; | ||
18 | #else /* __MIPSEL__ */ | ||
19 | #define ELF_DATA ELFDATA2LSB; | ||
20 | #endif | ||
21 | |||
22 | /* ELF register definitions */ | ||
23 | #define ELF_NGREG 45 | ||
24 | #define ELF_NFPREG 33 | ||
25 | |||
26 | typedef unsigned long elf_greg_t; | ||
27 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | ||
28 | |||
29 | typedef double elf_fpreg_t; | ||
30 | typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; | ||
31 | |||
32 | /* | ||
33 | * This is used to ensure we don't load something for the wrong architecture. | ||
34 | */ | ||
35 | #define elf_check_arch elfn32_check_arch | ||
36 | |||
37 | #define TASK32_SIZE 0x7fff8000UL | ||
38 | #undef ELF_ET_DYN_BASE | ||
39 | #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) | ||
40 | |||
41 | #include <asm/processor.h> | ||
42 | #include <linux/elfcore.h> | ||
43 | #include <linux/compat.h> | ||
44 | #include <linux/math64.h> | ||
45 | |||
46 | #define elf_prstatus elf_prstatus32 | ||
47 | struct elf_prstatus32 | ||
48 | { | ||
49 | struct elf_siginfo pr_info; /* Info associated with signal */ | ||
50 | short pr_cursig; /* Current signal */ | ||
51 | unsigned int pr_sigpend; /* Set of pending signals */ | ||
52 | unsigned int pr_sighold; /* Set of held signals */ | ||
53 | pid_t pr_pid; | ||
54 | pid_t pr_ppid; | ||
55 | pid_t pr_pgrp; | ||
56 | pid_t pr_sid; | ||
57 | struct old_timeval32 pr_utime; /* User time */ | ||
58 | struct old_timeval32 pr_stime; /* System time */ | ||
59 | struct old_timeval32 pr_cutime;/* Cumulative user time */ | ||
60 | struct old_timeval32 pr_cstime;/* Cumulative system time */ | ||
61 | elf_gregset_t pr_reg; /* GP registers */ | ||
62 | int pr_fpvalid; /* True if math co-processor being used. */ | ||
63 | }; | ||
64 | |||
65 | #define elf_prpsinfo elf_prpsinfo32 | ||
66 | struct elf_prpsinfo32 | ||
67 | { | ||
68 | char pr_state; /* numeric process state */ | ||
69 | char pr_sname; /* char for pr_state */ | ||
70 | char pr_zomb; /* zombie */ | ||
71 | char pr_nice; /* nice val */ | ||
72 | unsigned int pr_flag; /* flags */ | ||
73 | __kernel_uid_t pr_uid; | ||
74 | __kernel_gid_t pr_gid; | ||
75 | pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid; | ||
76 | /* Lots missing */ | ||
77 | char pr_fname[16]; /* filename of executable */ | ||
78 | char pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */ | ||
79 | }; | ||
80 | |||
81 | #define elf_caddr_t u32 | ||
82 | #define init_elf_binfmt init_elfn32_binfmt | ||
83 | |||
84 | #define jiffies_to_timeval jiffies_to_old_timeval32 | ||
85 | static __inline__ void | ||
86 | jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value) | ||
87 | { | ||
88 | /* | ||
89 | * Convert jiffies to nanoseconds and separate with | ||
90 | * one divide. | ||
91 | */ | ||
92 | u64 nsec = (u64)jiffies * TICK_NSEC; | ||
93 | u32 rem; | ||
94 | value->tv_sec = div_u64_rem(nsec, NSEC_PER_SEC, &rem); | ||
95 | value->tv_usec = rem / NSEC_PER_USEC; | ||
96 | } | ||
97 | |||
98 | #define ELF_CORE_EFLAGS EF_MIPS_ABI2 | ||
99 | |||
100 | #undef TASK_SIZE | ||
101 | #define TASK_SIZE TASK_SIZE32 | ||
102 | |||
103 | #undef ns_to_kernel_old_timeval | ||
104 | #define ns_to_kernel_old_timeval ns_to_old_timeval32 | ||
105 | |||
106 | /* | ||
107 | * Some data types as stored in coredump. | ||
108 | */ | ||
109 | #define user_long_t compat_long_t | ||
110 | #define user_siginfo_t compat_siginfo_t | ||
111 | #define copy_siginfo_to_external copy_siginfo_to_external32 | ||
112 | |||
113 | #include "../../../fs/binfmt_elf.c" | ||