Skip to content

Commit

Permalink
arch/tile: avoid ISO namespace pollution with <asm/sigcontext.h>
Browse files Browse the repository at this point in the history
<asm/sigcontext.h> is used by glibc's <bits/sigcontext.h> from <signal.h>,
which means that it can't clutter the namespace with random symbols
or #defines.  However, we use <arch/abi.h> to get a suitable type to
hold a machine register.

This change makes <arch/abi.h> safe to use in this kind of context
if __need_int_reg_t is defined prior to including the file; in that
case, it only defines a few symbols that are safe in the ISO namespace
(prefixed with double underscores).  <asm/sigcontext.h> then uses
the __uint_reg_t type instead of the normal uint_reg_t.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
  • Loading branch information
Chris Metcalf committed Nov 3, 2011
1 parent c3b92c8 commit e0b1f39
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 35 deletions.
99 changes: 72 additions & 27 deletions arch/tile/include/arch/abi.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,78 @@
/**
* @file
*
* ABI-related register definitions helpful when writing assembly code.
* ABI-related register definitions.
*/

#ifndef __ARCH_ABI_H__
#define __ARCH_ABI_H__

#include <arch/chip.h>
#if !defined __need_int_reg_t && !defined __DOXYGEN__
# define __ARCH_ABI_H__
# include <arch/chip.h>
#endif

/* Provide the basic machine types. */
#ifndef __INT_REG_BITS

/** Number of bits in a register. */
#if defined __tilegx__
# define __INT_REG_BITS 64
#elif defined __tilepro__
# define __INT_REG_BITS 32
#elif !defined __need_int_reg_t
# include <arch/chip.h>
# define __INT_REG_BITS CHIP_WORD_SIZE()
#else
# error Unrecognized architecture with __need_int_reg_t
#endif

#if __INT_REG_BITS == 64

#ifndef __ASSEMBLER__
/** Unsigned type that can hold a register. */
typedef unsigned long long __uint_reg_t;

/** Signed type that can hold a register. */
typedef long long __int_reg_t;
#endif

/** String prefix to use for printf(). */
#define __INT_REG_FMT "ll"

#else

#ifndef __ASSEMBLER__
/** Unsigned type that can hold a register. */
typedef unsigned long __uint_reg_t;

/** Signed type that can hold a register. */
typedef long __int_reg_t;
#endif

/** String prefix to use for printf(). */
#define __INT_REG_FMT "l"

#endif
#endif /* __INT_REG_BITS */


#ifndef __need_int_reg_t


#ifndef __ASSEMBLER__
/** Unsigned type that can hold a register. */
typedef __uint_reg_t uint_reg_t;

/** Signed type that can hold a register. */
typedef __int_reg_t int_reg_t;
#endif

/** String prefix to use for printf(). */
#define INT_REG_FMT __INT_REG_FMT

/** Number of bits in a register. */
#define INT_REG_BITS __INT_REG_BITS


/* Registers 0 - 55 are "normal", but some perform special roles. */

Expand Down Expand Up @@ -59,38 +124,18 @@
* The ABI requires callers to allocate a caller state save area of
* this many bytes at the bottom of each stack frame.
*/
#define C_ABI_SAVE_AREA_SIZE (2 * (CHIP_WORD_SIZE() / 8))
#define C_ABI_SAVE_AREA_SIZE (2 * (INT_REG_BITS / 8))

/**
* The operand to an 'info' opcode directing the backtracer to not
* try to find the calling frame.
*/
#define INFO_OP_CANNOT_BACKTRACE 2

#ifndef __ASSEMBLER__
#if CHIP_WORD_SIZE() > 32

/** Unsigned type that can hold a register. */
typedef unsigned long long uint_reg_t;
#endif /* !__need_int_reg_t */

/** Signed type that can hold a register. */
typedef long long int_reg_t;

/** String prefix to use for printf(). */
#define INT_REG_FMT "ll"

#elif !defined(__LP64__) /* avoid confusion with LP64 cross-build tools */

/** Unsigned type that can hold a register. */
typedef unsigned long uint_reg_t;

/** Signed type that can hold a register. */
typedef long int_reg_t;

/** String prefix to use for printf(). */
#define INT_REG_FMT "l"

#endif
#endif /* __ASSEMBLER__ */
/* Make sure we later can get all the definitions and declarations. */
#undef __need_int_reg_t

#endif /* !__ARCH_ABI_H__ */
18 changes: 10 additions & 8 deletions arch/tile/include/asm/sigcontext.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,23 @@
#ifndef _ASM_TILE_SIGCONTEXT_H
#define _ASM_TILE_SIGCONTEXT_H

/* Don't pollute the namespace since <signal.h> includes this file. */
#define __need_int_reg_t
#include <arch/abi.h>

/*
* struct sigcontext has the same shape as struct pt_regs,
* but is simplified since we know the fault is from userspace.
*/
struct sigcontext {
uint_reg_t gregs[53]; /* General-purpose registers. */
uint_reg_t tp; /* Aliases gregs[TREG_TP]. */
uint_reg_t sp; /* Aliases gregs[TREG_SP]. */
uint_reg_t lr; /* Aliases gregs[TREG_LR]. */
uint_reg_t pc; /* Program counter. */
uint_reg_t ics; /* In Interrupt Critical Section? */
uint_reg_t faultnum; /* Fault number. */
uint_reg_t pad[5];
__uint_reg_t gregs[53]; /* General-purpose registers. */
__uint_reg_t tp; /* Aliases gregs[TREG_TP]. */
__uint_reg_t sp; /* Aliases gregs[TREG_SP]. */
__uint_reg_t lr; /* Aliases gregs[TREG_LR]. */
__uint_reg_t pc; /* Program counter. */
__uint_reg_t ics; /* In Interrupt Critical Section? */
__uint_reg_t faultnum; /* Fault number. */
__uint_reg_t pad[5];
};

#endif /* _ASM_TILE_SIGCONTEXT_H */

0 comments on commit e0b1f39

Please sign in to comment.