cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

binfmts.h (4397B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _LINUX_BINFMTS_H
      3#define _LINUX_BINFMTS_H
      4
      5#include <linux/sched.h>
      6#include <linux/unistd.h>
      7#include <asm/exec.h>
      8#include <uapi/linux/binfmts.h>
      9
     10struct filename;
     11struct coredump_params;
     12
     13#define CORENAME_MAX_SIZE 128
     14
     15/*
     16 * This structure is used to hold the arguments that are used when loading binaries.
     17 */
     18struct linux_binprm {
     19#ifdef CONFIG_MMU
     20	struct vm_area_struct *vma;
     21	unsigned long vma_pages;
     22#else
     23# define MAX_ARG_PAGES	32
     24	struct page *page[MAX_ARG_PAGES];
     25#endif
     26	struct mm_struct *mm;
     27	unsigned long p; /* current top of mem */
     28	unsigned long argmin; /* rlimit marker for copy_strings() */
     29	unsigned int
     30		/* Should an execfd be passed to userspace? */
     31		have_execfd:1,
     32
     33		/* Use the creds of a script (see binfmt_misc) */
     34		execfd_creds:1,
     35		/*
     36		 * Set by bprm_creds_for_exec hook to indicate a
     37		 * privilege-gaining exec has happened. Used to set
     38		 * AT_SECURE auxv for glibc.
     39		 */
     40		secureexec:1,
     41		/*
     42		 * Set when errors can no longer be returned to the
     43		 * original userspace.
     44		 */
     45		point_of_no_return:1;
     46#ifdef __alpha__
     47	unsigned int taso:1;
     48#endif
     49	struct file *executable; /* Executable to pass to the interpreter */
     50	struct file *interpreter;
     51	struct file *file;
     52	struct cred *cred;	/* new credentials */
     53	int unsafe;		/* how unsafe this exec is (mask of LSM_UNSAFE_*) */
     54	unsigned int per_clear;	/* bits to clear in current->personality */
     55	int argc, envc;
     56	const char *filename;	/* Name of binary as seen by procps */
     57	const char *interp;	/* Name of the binary really executed. Most
     58				   of the time same as filename, but could be
     59				   different for binfmt_{misc,script} */
     60	const char *fdpath;	/* generated filename for execveat */
     61	unsigned interp_flags;
     62	int execfd;		/* File descriptor of the executable */
     63	unsigned long loader, exec;
     64
     65	struct rlimit rlim_stack; /* Saved RLIMIT_STACK used during exec. */
     66
     67	char buf[BINPRM_BUF_SIZE];
     68} __randomize_layout;
     69
     70#define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0
     71#define BINPRM_FLAGS_ENFORCE_NONDUMP (1 << BINPRM_FLAGS_ENFORCE_NONDUMP_BIT)
     72
     73/* filename of the binary will be inaccessible after exec */
     74#define BINPRM_FLAGS_PATH_INACCESSIBLE_BIT 2
     75#define BINPRM_FLAGS_PATH_INACCESSIBLE (1 << BINPRM_FLAGS_PATH_INACCESSIBLE_BIT)
     76
     77/* preserve argv0 for the interpreter  */
     78#define BINPRM_FLAGS_PRESERVE_ARGV0_BIT 3
     79#define BINPRM_FLAGS_PRESERVE_ARGV0 (1 << BINPRM_FLAGS_PRESERVE_ARGV0_BIT)
     80
     81/*
     82 * This structure defines the functions that are used to load the binary formats that
     83 * linux accepts.
     84 */
     85struct linux_binfmt {
     86	struct list_head lh;
     87	struct module *module;
     88	int (*load_binary)(struct linux_binprm *);
     89	int (*load_shlib)(struct file *);
     90#ifdef CONFIG_COREDUMP
     91	int (*core_dump)(struct coredump_params *cprm);
     92	unsigned long min_coredump;	/* minimal dump size */
     93#endif
     94} __randomize_layout;
     95
     96extern void __register_binfmt(struct linux_binfmt *fmt, int insert);
     97
     98/* Registration of default binfmt handlers */
     99static inline void register_binfmt(struct linux_binfmt *fmt)
    100{
    101	__register_binfmt(fmt, 0);
    102}
    103/* Same as above, but adds a new binfmt at the top of the list */
    104static inline void insert_binfmt(struct linux_binfmt *fmt)
    105{
    106	__register_binfmt(fmt, 1);
    107}
    108
    109extern void unregister_binfmt(struct linux_binfmt *);
    110
    111extern int __must_check remove_arg_zero(struct linux_binprm *);
    112extern int begin_new_exec(struct linux_binprm * bprm);
    113extern void setup_new_exec(struct linux_binprm * bprm);
    114extern void finalize_exec(struct linux_binprm *bprm);
    115extern void would_dump(struct linux_binprm *, struct file *);
    116
    117extern int suid_dumpable;
    118
    119/* Stack area protections */
    120#define EXSTACK_DEFAULT   0	/* Whatever the arch defaults to */
    121#define EXSTACK_DISABLE_X 1	/* Disable executable stacks */
    122#define EXSTACK_ENABLE_X  2	/* Enable executable stacks */
    123
    124extern int setup_arg_pages(struct linux_binprm * bprm,
    125			   unsigned long stack_top,
    126			   int executable_stack);
    127extern int transfer_args_to_stack(struct linux_binprm *bprm,
    128				  unsigned long *sp_location);
    129extern int bprm_change_interp(const char *interp, struct linux_binprm *bprm);
    130int copy_string_kernel(const char *arg, struct linux_binprm *bprm);
    131extern void set_binfmt(struct linux_binfmt *new);
    132extern ssize_t read_code(struct file *, unsigned long, loff_t, size_t);
    133
    134int kernel_execve(const char *filename,
    135		  const char *const *argv, const char *const *envp);
    136
    137#endif /* _LINUX_BINFMTS_H */