/*
 * Linker script for gate DSO.  The gate pages are an ELF shared object prelinked to its
 * virtual address, with only one read-only segment and one execute-only segment (both fit
 * in one page).  This script controls its layout.
 */

#include <linux/config.h>

#include <asm/system.h>

SECTIONS
{
  . = GATE_ADDR + SIZEOF_HEADERS;

  .hash				: { *(.hash) }				:readable
  .dynsym			: { *(.dynsym) }
  .dynstr			: { *(.dynstr) }
  .gnu.version			: { *(.gnu.version) }
  .gnu.version_d		: { *(.gnu.version_d) }
  .gnu.version_r		: { *(.gnu.version_r) }
  .dynamic			: { *(.dynamic) }			:readable :dynamic

  /*
   * This linker script is used both with -r and with -shared.  For the layouts to match,
   * we need to skip more than enough space for the dynamic symbol table et al.  If this
   * amount is insufficient, ld -shared will barf.  Just increase it here.
   */
  . = GATE_ADDR + 0x500;

  .data.patch			: {
				    __start_gate_mckinley_e9_patchlist = .;
				    *(.data.patch.mckinley_e9)
				    __end_gate_mckinley_e9_patchlist = .;

				    __start_gate_vtop_patchlist = .;
				    *(.data.patch.vtop)
				    __end_gate_vtop_patchlist = .;

				    __start_gate_fsyscall_patchlist = .;
				    *(.data.patch.fsyscall_table)
				    __end_gate_fsyscall_patchlist = .;

				    __start_gate_brl_fsys_bubble_down_patchlist = .;
				    *(.data.patch.brl_fsys_bubble_down)
				    __end_gate_brl_fsys_bubble_down_patchlist = .;
  }									:readable
  .IA_64.unwind_info		: { *(.IA_64.unwind_info*) }
  .IA_64.unwind			: { *(.IA_64.unwind*) }			:readable :unwind
#ifdef HAVE_BUGGY_SEGREL
  .text (GATE_ADDR + PAGE_SIZE)	: { *(.text) *(.text.*) }		:readable
#else
  . = ALIGN (PERCPU_PAGE_SIZE) + (. & (PERCPU_PAGE_SIZE - 1));
  .text				: { *(.text) *(.text.*) }		:epc
#endif

  /DISCARD/			: {
  	*(.got.plt) *(.got)
	*(.data .data.* .gnu.linkonce.d.*)
	*(.dynbss)
	*(.bss .bss.* .gnu.linkonce.b.*)
	*(__ex_table)
  }
}

/*
 * We must supply the ELF program headers explicitly to get just one
 * PT_LOAD segment, and set the flags explicitly to make segments read-only.
 */
PHDRS
{
  readable  PT_LOAD	FILEHDR	PHDRS	FLAGS(4);	/* PF_R */
#ifndef HAVE_BUGGY_SEGREL
  epc	    PT_LOAD	FILEHDR PHDRS	FLAGS(1);	/* PF_X */
#endif
  dynamic   PT_DYNAMIC			FLAGS(4);	/* PF_R */
  unwind    0x70000001; /* PT_IA_64_UNWIND, but ld doesn't match the name */
}

/*
 * This controls what symbols we export from the DSO.
 */
VERSION
{
  LINUX_2.5 {
    global:
	__kernel_syscall_via_break;
	__kernel_syscall_via_epc;
	__kernel_sigtramp;

    local: *;
  };
}

/* The ELF entry point can be used to set the AT_SYSINFO value.  */
ENTRY(__kernel_syscall_via_epc)
