1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Support for o32 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 int 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 elfo32_check_arch
36 
37 #ifdef CONFIG_KVM_GUEST
38 #define TASK32_SIZE		0x3fff8000UL
39 #else
40 #define TASK32_SIZE		0x7fff8000UL
41 #endif
42 #undef ELF_ET_DYN_BASE
43 #define ELF_ET_DYN_BASE		(TASK32_SIZE / 3 * 2)
44 
45 #include <asm/processor.h>
46 
47 #include <linux/elfcore.h>
48 #include <linux/compat.h>
49 #include <linux/math64.h>
50 
51 #define elf_prstatus elf_prstatus32
52 struct elf_prstatus32
53 {
54 	struct elf_siginfo pr_info;	/* Info associated with signal */
55 	short	pr_cursig;		/* Current signal */
56 	unsigned int pr_sigpend;	/* Set of pending signals */
57 	unsigned int pr_sighold;	/* Set of held signals */
58 	pid_t	pr_pid;
59 	pid_t	pr_ppid;
60 	pid_t	pr_pgrp;
61 	pid_t	pr_sid;
62 	struct old_timeval32 pr_utime; /* User time */
63 	struct old_timeval32 pr_stime; /* System time */
64 	struct old_timeval32 pr_cutime;/* Cumulative user time */
65 	struct old_timeval32 pr_cstime;/* Cumulative system time */
66 	elf_gregset_t pr_reg;	/* GP registers */
67 	int pr_fpvalid;		/* True if math co-processor being used.  */
68 };
69 
70 #define elf_prpsinfo elf_prpsinfo32
71 struct elf_prpsinfo32
72 {
73 	char	pr_state;	/* numeric process state */
74 	char	pr_sname;	/* char for pr_state */
75 	char	pr_zomb;	/* zombie */
76 	char	pr_nice;	/* nice val */
77 	unsigned int pr_flag;	/* flags */
78 	__kernel_uid_t	pr_uid;
79 	__kernel_gid_t	pr_gid;
80 	pid_t	pr_pid, pr_ppid, pr_pgrp, pr_sid;
81 	/* Lots missing */
82 	char	pr_fname[16];	/* filename of executable */
83 	char	pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
84 };
85 
86 #define elf_caddr_t	u32
87 #define init_elf_binfmt init_elf32_binfmt
88 
89 #define jiffies_to_timeval jiffies_to_old_timeval32
90 static inline void
jiffies_to_old_timeval32(unsigned long jiffies,struct old_timeval32 * value)91 jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
92 {
93 	/*
94 	 * Convert jiffies to nanoseconds and separate with
95 	 * one divide.
96 	 */
97 	u64 nsec = (u64)jiffies * TICK_NSEC;
98 	u32 rem;
99 	value->tv_sec = div_u64_rem(nsec, NSEC_PER_SEC, &rem);
100 	value->tv_usec = rem / NSEC_PER_USEC;
101 }
102 
103 #undef TASK_SIZE
104 #define TASK_SIZE TASK_SIZE32
105 
106 #undef ns_to_timeval
107 #define ns_to_timeval ns_to_old_timeval32
108 
109 #include "../../../fs/binfmt_elf.c"
110