forked from mirrors/linux
		
	Christoph Hellwig suggested a slightly different path for handling backwards compatibility with the 32-bit time_t based system calls: Rather than simply reusing the compat_sys_* entry points on 32-bit architectures unchanged, we get rid of those entry points and the compat_time types by renaming them to something that makes more sense on 32-bit architectures (which don't have a compat mode otherwise), and then share the entry points under the new name with the 64-bit architectures that use them for implementing the compatibility. The following types and interfaces are renamed here, and moved from linux/compat_time.h to linux/time32.h: old new --- --- compat_time_t old_time32_t struct compat_timeval struct old_timeval32 struct compat_timespec struct old_timespec32 struct compat_itimerspec struct old_itimerspec32 ns_to_compat_timeval() ns_to_old_timeval32() get_compat_itimerspec64() get_old_itimerspec32() put_compat_itimerspec64() put_old_itimerspec32() compat_get_timespec64() get_old_timespec32() compat_put_timespec64() put_old_timespec32() As we already have aliases in place, this patch addresses only the instances that are relevant to the system call interface in particular, not those that occur in device drivers and other modules. Those will get handled separately, while providing the 64-bit version of the respective interfaces. I'm not renaming the timex, rusage and itimerval structures, as we are still debating what the new interface will look like, and whether we will need a replacement at all. This also doesn't change the names of the syscall entry points, which can be done more easily when we actually switch over the 32-bit architectures to use them, at that point we need to change COMPAT_SYSCALL_DEFINEx to SYSCALL_DEFINEx with a new name, e.g. with a _time32 suffix. Suggested-by: Christoph Hellwig <hch@infradead.org> Link: https://lore.kernel.org/lkml/20180705222110.GA5698@infradead.org/ Signed-off-by: Arnd Bergmann <arnd@arndb.de>
		
			
				
	
	
		
			131 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 32-bit compatibility support for ELF format executables and core dumps.
 | 
						|
 *
 | 
						|
 * Copyright (C) 2007 Red Hat, Inc.  All rights reserved.
 | 
						|
 *
 | 
						|
 * This copyrighted material is made available to anyone wishing to use,
 | 
						|
 * modify, copy, or redistribute it subject to the terms and conditions
 | 
						|
 * of the GNU General Public License v.2.
 | 
						|
 *
 | 
						|
 * Red Hat Author: Roland McGrath.
 | 
						|
 *
 | 
						|
 * This file is used in a 64-bit kernel that wants to support 32-bit ELF.
 | 
						|
 * asm/elf.h is responsible for defining the compat_* and COMPAT_* macros
 | 
						|
 * used below, with definitions appropriate for 32-bit ABI compatibility.
 | 
						|
 *
 | 
						|
 * We use macros to rename the ABI types and machine-dependent
 | 
						|
 * functions used in binfmt_elf.c to compat versions.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/elfcore-compat.h>
 | 
						|
#include <linux/time.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * Rename the basic ELF layout types to refer to the 32-bit class of files.
 | 
						|
 */
 | 
						|
#undef	ELF_CLASS
 | 
						|
#define ELF_CLASS	ELFCLASS32
 | 
						|
 | 
						|
#undef	elfhdr
 | 
						|
#undef	elf_phdr
 | 
						|
#undef	elf_shdr
 | 
						|
#undef	elf_note
 | 
						|
#undef	elf_addr_t
 | 
						|
#define elfhdr		elf32_hdr
 | 
						|
#define elf_phdr	elf32_phdr
 | 
						|
#define elf_shdr	elf32_shdr
 | 
						|
#define elf_note	elf32_note
 | 
						|
#define elf_addr_t	Elf32_Addr
 | 
						|
 | 
						|
/*
 | 
						|
 * Some data types as stored in coredump.
 | 
						|
 */
 | 
						|
#define user_long_t		compat_long_t
 | 
						|
#define user_siginfo_t		compat_siginfo_t
 | 
						|
#define copy_siginfo_to_user	copy_siginfo_to_user32
 | 
						|
 | 
						|
/*
 | 
						|
 * The machine-dependent core note format types are defined in elfcore-compat.h,
 | 
						|
 * which requires asm/elf.h to define compat_elf_gregset_t et al.
 | 
						|
 */
 | 
						|
#define elf_prstatus	compat_elf_prstatus
 | 
						|
#define elf_prpsinfo	compat_elf_prpsinfo
 | 
						|
 | 
						|
#undef ns_to_timeval
 | 
						|
#define ns_to_timeval ns_to_old_timeval32
 | 
						|
 | 
						|
/*
 | 
						|
 * To use this file, asm/elf.h must define compat_elf_check_arch.
 | 
						|
 * The other following macros can be defined if the compat versions
 | 
						|
 * differ from the native ones, or omitted when they match.
 | 
						|
 */
 | 
						|
 | 
						|
#undef	ELF_ARCH
 | 
						|
#undef	elf_check_arch
 | 
						|
#define	elf_check_arch	compat_elf_check_arch
 | 
						|
 | 
						|
#ifdef	COMPAT_ELF_PLATFORM
 | 
						|
#undef	ELF_PLATFORM
 | 
						|
#define	ELF_PLATFORM		COMPAT_ELF_PLATFORM
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	COMPAT_ELF_HWCAP
 | 
						|
#undef	ELF_HWCAP
 | 
						|
#define	ELF_HWCAP		COMPAT_ELF_HWCAP
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	COMPAT_ELF_HWCAP2
 | 
						|
#undef	ELF_HWCAP2
 | 
						|
#define	ELF_HWCAP2		COMPAT_ELF_HWCAP2
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	COMPAT_ARCH_DLINFO
 | 
						|
#undef	ARCH_DLINFO
 | 
						|
#define	ARCH_DLINFO		COMPAT_ARCH_DLINFO
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	COMPAT_ELF_ET_DYN_BASE
 | 
						|
#undef	ELF_ET_DYN_BASE
 | 
						|
#define	ELF_ET_DYN_BASE		COMPAT_ELF_ET_DYN_BASE
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef COMPAT_ELF_EXEC_PAGESIZE
 | 
						|
#undef	ELF_EXEC_PAGESIZE
 | 
						|
#define	ELF_EXEC_PAGESIZE	COMPAT_ELF_EXEC_PAGESIZE
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	COMPAT_ELF_PLAT_INIT
 | 
						|
#undef	ELF_PLAT_INIT
 | 
						|
#define	ELF_PLAT_INIT		COMPAT_ELF_PLAT_INIT
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	COMPAT_SET_PERSONALITY
 | 
						|
#undef	SET_PERSONALITY
 | 
						|
#define	SET_PERSONALITY		COMPAT_SET_PERSONALITY
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	compat_start_thread
 | 
						|
#undef	start_thread
 | 
						|
#define	start_thread		compat_start_thread
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	compat_arch_setup_additional_pages
 | 
						|
#undef	ARCH_HAS_SETUP_ADDITIONAL_PAGES
 | 
						|
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
 | 
						|
#undef	arch_setup_additional_pages
 | 
						|
#define	arch_setup_additional_pages compat_arch_setup_additional_pages
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * Rename a few of the symbols that binfmt_elf.c will define.
 | 
						|
 * These are all local so the names don't really matter, but it
 | 
						|
 * might make some debugging less confusing not to duplicate them.
 | 
						|
 */
 | 
						|
#define elf_format		compat_elf_format
 | 
						|
#define init_elf_binfmt		init_compat_elf_binfmt
 | 
						|
#define exit_elf_binfmt		exit_compat_elf_binfmt
 | 
						|
 | 
						|
/*
 | 
						|
 * We share all the actual code with the native (64-bit) version.
 | 
						|
 */
 | 
						|
#include "binfmt_elf.c"
 |