Generate system call tables and unistd_*.h automatically from the tables in arch/x86/syscalls. All other information, like NR_syscalls, is auto-generated, some of which is in asm-offsets_*.c. This allows us to keep all the system call information in one place, and allows for kernel space and user space to see different information; this is currently used for the ia32 system call numbers when building the 64-bit kernel, but will be used by the x32 ABI in the near future. This also removes some gratuitious differences between i386, x86-64 and ia32; in particular, now all system call tables are generated with the same mechanism. Cc: H. J. Lu <hjl.tools@gmail.com> Cc: Sam Ravnborg <sam@ravnborg.org> Cc: Michal Marek <mmarek@suse.cz> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
#include <asm/ia32.h>
 | 
						|
 | 
						|
#define __SYSCALL_64(nr, sym, compat) [nr] = 1,
 | 
						|
static char syscalls_64[] = {
 | 
						|
#include <asm/syscalls_64.h>
 | 
						|
};
 | 
						|
#define __SYSCALL_I386(nr, sym, compat) [nr] = 1,
 | 
						|
static char syscalls_ia32[] = {
 | 
						|
#include <asm/syscalls_32.h>
 | 
						|
};
 | 
						|
 | 
						|
int main(void)
 | 
						|
{
 | 
						|
#ifdef CONFIG_PARAVIRT
 | 
						|
	OFFSET(PV_IRQ_adjust_exception_frame, pv_irq_ops, adjust_exception_frame);
 | 
						|
	OFFSET(PV_CPU_usergs_sysret32, pv_cpu_ops, usergs_sysret32);
 | 
						|
	OFFSET(PV_CPU_usergs_sysret64, pv_cpu_ops, usergs_sysret64);
 | 
						|
	OFFSET(PV_CPU_swapgs, pv_cpu_ops, swapgs);
 | 
						|
	BLANK();
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef CONFIG_IA32_EMULATION
 | 
						|
	OFFSET(TI_sysenter_return, thread_info, sysenter_return);
 | 
						|
	BLANK();
 | 
						|
 | 
						|
#define ENTRY(entry) OFFSET(IA32_SIGCONTEXT_ ## entry, sigcontext_ia32, entry)
 | 
						|
	ENTRY(ax);
 | 
						|
	ENTRY(bx);
 | 
						|
	ENTRY(cx);
 | 
						|
	ENTRY(dx);
 | 
						|
	ENTRY(si);
 | 
						|
	ENTRY(di);
 | 
						|
	ENTRY(bp);
 | 
						|
	ENTRY(sp);
 | 
						|
	ENTRY(ip);
 | 
						|
	BLANK();
 | 
						|
#undef ENTRY
 | 
						|
 | 
						|
	OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe_ia32, uc.uc_mcontext);
 | 
						|
	BLANK();
 | 
						|
#endif
 | 
						|
 | 
						|
#define ENTRY(entry) OFFSET(pt_regs_ ## entry, pt_regs, entry)
 | 
						|
	ENTRY(bx);
 | 
						|
	ENTRY(bx);
 | 
						|
	ENTRY(cx);
 | 
						|
	ENTRY(dx);
 | 
						|
	ENTRY(sp);
 | 
						|
	ENTRY(bp);
 | 
						|
	ENTRY(si);
 | 
						|
	ENTRY(di);
 | 
						|
	ENTRY(r8);
 | 
						|
	ENTRY(r9);
 | 
						|
	ENTRY(r10);
 | 
						|
	ENTRY(r11);
 | 
						|
	ENTRY(r12);
 | 
						|
	ENTRY(r13);
 | 
						|
	ENTRY(r14);
 | 
						|
	ENTRY(r15);
 | 
						|
	ENTRY(flags);
 | 
						|
	BLANK();
 | 
						|
#undef ENTRY
 | 
						|
 | 
						|
#define ENTRY(entry) OFFSET(saved_context_ ## entry, saved_context, entry)
 | 
						|
	ENTRY(cr0);
 | 
						|
	ENTRY(cr2);
 | 
						|
	ENTRY(cr3);
 | 
						|
	ENTRY(cr4);
 | 
						|
	ENTRY(cr8);
 | 
						|
	BLANK();
 | 
						|
#undef ENTRY
 | 
						|
 | 
						|
	OFFSET(TSS_ist, tss_struct, x86_tss.ist);
 | 
						|
	BLANK();
 | 
						|
 | 
						|
	DEFINE(__NR_syscall_max, sizeof(syscalls_64) - 1);
 | 
						|
	DEFINE(NR_syscalls, sizeof(syscalls_64));
 | 
						|
 | 
						|
	DEFINE(__NR_ia32_syscall_max, sizeof(syscalls_ia32) - 1);
 | 
						|
	DEFINE(IA32_NR_syscalls, sizeof(syscalls_ia32));
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 |