mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	I've moved the TILE-Gx and TILEPro ports to the main sysdeps hierarchy,
along with the linux-generic ports infrastructure.  Beyond the README
update, the move was just
    git mv ports/sysdeps/tile sysdeps/tile
    git mv ports/sysdeps/unix/sysv/linux/tile \
      sysdeps/unix/sysv/linux/tile
    git mv ports/sysdeps/unix/sysv/linux/generic \
      sysdeps/unix/sysv/linux/generic
I updated the relevant ChangeLogs along the lines of the ARM move
in commit c6bfe5c4d7 and tested the 64-bit tilegx build to confirm that
there were no changes in "objdump -dr" output in the shared objects.
		
	
		
			
				
	
	
		
			204 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* Copyright (C) 2011-2014 Free Software Foundation, Inc.
 | |
|    This file is part of the GNU C Library.
 | |
|    Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
 | |
| 
 | |
|    The GNU C Library is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU Lesser General Public
 | |
|    License as published by the Free Software Foundation; either
 | |
|    version 2.1 of the License, or (at your option) any later version.
 | |
| 
 | |
|    In addition to the permissions in the GNU Lesser General Public
 | |
|    License, the Free Software Foundation gives you unlimited
 | |
|    permission to link the compiled version of this file with other
 | |
|    programs, and to distribute those programs without any restriction
 | |
|    coming from the use of this file. (The GNU Lesser General Public
 | |
|    License restrictions do apply in other respects; for example, they
 | |
|    cover modification of the file, and distribution when not linked
 | |
|    into another program.)
 | |
| 
 | |
|    Note that people who make modified versions of this file are not
 | |
|    obligated to grant this special exception for their modified
 | |
|    versions; it is their choice whether to do so. The GNU Lesser
 | |
|    General Public License gives permission to release a modified
 | |
|    version without this exception; this exception also makes it
 | |
|    possible to release a modified version which carries forward this
 | |
|    exception.
 | |
| 
 | |
|    The GNU C Library is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|    Lesser General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU Lesser General Public
 | |
|    License along with the GNU C Library.  If not, see
 | |
|    <http://www.gnu.org/licenses/>.  */
 | |
| 
 | |
| /* This is the canonical entry point, usually the first thing in the text
 | |
|    segment.  The ELF standard tells us that the stack is set up like this on
 | |
|    entry (the left side is the offset from "sp"), in units of
 | |
|    __SIZEOF_POINTER__ entries:
 | |
| 
 | |
| 		+0		argc
 | |
| 		+1		argv[0]
 | |
| 		...
 | |
| 		+(argc+1)	NULL
 | |
| 		+(argc+2)	envp[0]
 | |
| 		...
 | |
| 				NULL
 | |
| 		...		ElfInfo
 | |
| 
 | |
|    The ElfInfo is pairs of key/value long words following the envp
 | |
|    pointers and terminated by a zero-valued key.
 | |
| 
 | |
|    Although not mandated by the standard, it happens to be the case
 | |
|    that we store the actual argv and envp strings immediately after
 | |
|    the ElfInfo data on the stack.
 | |
| 
 | |
|    On entry r0 points to the shared library termination function, or 0
 | |
|    if there isn't one.
 | |
| */
 | |
| 
 | |
| #include <features.h>
 | |
| #include <sysdep.h>
 | |
| #include <arch/abi.h>
 | |
| 
 | |
| /* Just create no-ops if we don't support PC-relative PLT relocations. */
 | |
| #ifdef NO_PLT_PCREL
 | |
| # define hw2_last_plt(x)	0
 | |
| # define hw1_plt(x)		0
 | |
| # define hw0_plt(x)		0
 | |
| #endif
 | |
| 
 | |
| 	.text
 | |
| 	.global _start
 | |
| 	.type   _start,@function
 | |
| 	.align 8
 | |
| _start:
 | |
| 	/* Linux starts us with sp pointing at the conventional Elf layout,
 | |
| 	   but we need to allow two "caller" words for our ABI convention.  */
 | |
| 	{
 | |
| 	 /* Load argc (stored as a "long", equivalent to a pointer type). */
 | |
| 	 LD_PTR r1, sp
 | |
| 
 | |
| 	 /* Save incoming 'sp', which points to the Elf argument block. */
 | |
| 	 move r52, sp
 | |
| 	}
 | |
| 
 | |
| 	{
 | |
| 	 /* Allocate stack frame callee space for __libc_start_main. */
 | |
| 	 ADDI_PTR r12, sp, -(2 * REGSIZE)
 | |
| 	}
 | |
| 
 | |
| 	{
 | |
| 	 /* Get our PC. */
 | |
| 	 lnk r13
 | |
| 
 | |
| 	 /* sp is not necessarily properly aligned on startup because
 | |
| 	    of the way ld.so pops off leading argv elements. So align it. */
 | |
| 	 andi sp, r12, -8
 | |
| 	}
 | |
| .Lmy_pc:
 | |
| 
 | |
| 	{
 | |
| 	 /* Pass the address of the shared library termination function. */
 | |
| 	 move r5, r0
 | |
| 
 | |
| 	 /* Compute location where __libc_start_main's caller is supposed to
 | |
| 	    store its frame pointer. */
 | |
| 	 ADDI_PTR r12, sp, REGSIZE
 | |
| 
 | |
| 	 /* Zero out callee space for return address. Unnecessary but free.
 | |
| 	    This is just paranoia to help backtracing not go awry. */
 | |
| 	 ST sp, zero
 | |
| 	}
 | |
| 	{
 | |
| 	 /* Zero out our frame pointer for __libc_start_main. */
 | |
| 	 ST r12, zero
 | |
| 
 | |
| 	 /* Zero out lr to make __libc_start_main the end of backtrace.  */
 | |
| 	 move lr, zero
 | |
| 
 | |
| 	 /* Compute a pointer to argv. envp will be determined
 | |
| 	    later in __libc_start_main.  We set up the first argument
 | |
| 	    (the address of main) below. */
 | |
| 	 ADDI_PTR r2, r52, __SIZEOF_POINTER__
 | |
| 	}
 | |
| 	{
 | |
| 	 /* Pass the highest stack address to user code. */
 | |
| 	 ADDI_PTR r6, sp, (2 * REGSIZE)
 | |
| 
 | |
| 	 /* Pass address of main() in r0, and of our own entry
 | |
| 	    points to .fini and .init in r3 and r4.  */
 | |
| #ifdef __tilegx__
 | |
| 	 moveli r0, hw2_last(main - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 shl16insli r0, r0, hw1(main - .Lmy_pc)
 | |
| 	 moveli r3, hw2_last(__libc_csu_init - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 shl16insli r0, r0, hw0(main - .Lmy_pc)
 | |
| 	 shl16insli r3, r3, hw1(__libc_csu_init - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 ADD_PTR r0, r0, r13
 | |
| 	 shl16insli r3, r3, hw0(__libc_csu_init - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 moveli r12, hw2_last_plt(__libc_start_main - .Lmy_pc)
 | |
| 	 ADD_PTR r3, r3, r13
 | |
| 	}
 | |
| 	{
 | |
| 	 shl16insli r12, r12, hw1_plt(__libc_start_main - .Lmy_pc)
 | |
| 	 moveli r4, hw2_last(__libc_csu_fini - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 shl16insli r12, r12, hw0_plt(__libc_start_main - .Lmy_pc)
 | |
| 	 shl16insli r4, r4, hw1(__libc_csu_fini - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 ADD_PTR r12, r12, r13
 | |
| 	 shl16insli r4, r4, hw0(__libc_csu_fini - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 ADD_PTR r4, r4, r13
 | |
| # ifdef NO_PLT_PCREL
 | |
| 	 j plt(__libc_start_main)
 | |
| # else
 | |
| 	 jr r12
 | |
| # endif
 | |
| 	}
 | |
| #else
 | |
| 	 addli r0, r13, lo16(main - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 auli r0, r0, ha16(main - .Lmy_pc)
 | |
| 	 addli r3, r13, lo16(__libc_csu_init - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 auli r3, r3, ha16(__libc_csu_init - .Lmy_pc)
 | |
| 	 addli r4, r13, lo16(__libc_csu_fini - .Lmy_pc)
 | |
| 	}
 | |
| 	{
 | |
| 	 auli r4, r4, ha16(__libc_csu_fini - .Lmy_pc)
 | |
| 	 /* Call the user's main function, and exit with its value.
 | |
| 	    But let the libc call main. */
 | |
| 	 j plt(__libc_start_main)
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| 	{
 | |
| 	 /* Tell backtracer to give up (_start has no caller). */
 | |
| 	 info INFO_OP_CANNOT_BACKTRACE
 | |
| 	}
 | |
| .size _start, .-_start
 | |
| 
 | |
| /* Define a symbol for the first piece of initialized data.  */
 | |
| 	.data
 | |
| 	.global __data_start
 | |
| 	.align 8
 | |
| __data_start:
 | |
| 	.long 0
 | |
| 	.weak data_start
 | |
| 	data_start = __data_start
 |