Merge ^/head r307736 through r308146.
This commit is contained in:
commit
02ebdc7823
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/clang390-import/; revision=308147
6
Makefile
6
Makefile
@ -239,7 +239,7 @@ _MAKE+= MK_META_MODE=no
|
||||
_TARGET_ARCH= ${TARGET:S/pc98/i386/:S/arm64/aarch64/}
|
||||
.elif !defined(TARGET) && defined(TARGET_ARCH) && \
|
||||
${TARGET_ARCH} != ${MACHINE_ARCH}
|
||||
_TARGET= ${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/aarch64/arm64/:C/powerpc64/powerpc/:C/riscv64/riscv/}
|
||||
_TARGET= ${TARGET_ARCH:C/mips(n32|64)?(el)?(hf)?/mips/:C/arm(v6)?(eb)?/arm/:C/aarch64/arm64/:C/powerpc64/powerpc/:C/powerpcspe/powerpc/:C/riscv64/riscv/}
|
||||
.endif
|
||||
.if defined(TARGET) && !defined(_TARGET)
|
||||
_TARGET=${TARGET}
|
||||
@ -421,8 +421,8 @@ TARGETS?=amd64 arm arm64 i386 mips pc98 powerpc sparc64
|
||||
_UNIVERSE_TARGETS= ${TARGETS}
|
||||
TARGET_ARCHES_arm?= arm armeb armv6
|
||||
TARGET_ARCHES_arm64?= aarch64
|
||||
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32
|
||||
TARGET_ARCHES_powerpc?= powerpc powerpc64
|
||||
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 mipselhf mipshf mips64elhf mips64hf
|
||||
TARGET_ARCHES_powerpc?= powerpc powerpc64 powerpcspe
|
||||
TARGET_ARCHES_pc98?= i386
|
||||
.for target in ${TARGETS}
|
||||
TARGET_ARCHES_${target}?= ${target}
|
||||
|
@ -356,8 +356,13 @@ KNOWN_ARCHES?= aarch64/arm64 \
|
||||
mipsn32el/mips \
|
||||
mips64/mips \
|
||||
mipsn32/mips \
|
||||
mipshf/mips \
|
||||
mipselhf/mips \
|
||||
mips64elhf/mips \
|
||||
mips64hf/mips \
|
||||
powerpc \
|
||||
powerpc64/powerpc \
|
||||
powerpcspe/powerpc \
|
||||
riscv64/riscv \
|
||||
sparc64
|
||||
|
||||
@ -452,7 +457,7 @@ PACKAGE= kernel
|
||||
#
|
||||
|
||||
BOOTSTRAPPING?= 0
|
||||
# Keep these in sync
|
||||
# Keep these in sync -- see below for special case exception
|
||||
MINIMUM_SUPPORTED_OSREL?= 900044
|
||||
MINIMUM_SUPPORTED_REL?= 9.1
|
||||
|
||||
@ -1556,10 +1561,23 @@ _elftoolchain_libs= lib/libelf lib/libdwarf
|
||||
.endif
|
||||
|
||||
legacy: .PHONY
|
||||
# Temporary special case for automatically detecting the clang compiler issue
|
||||
# Note: 9.x didn't have FreeBSD_version bumps often enough, so you may need to
|
||||
# set BOOTSTRAPPING to 0 if you're stable/9 tree post-dates r286035 but is before
|
||||
# the version bump in r296219 (from July 29, 2015 -> Feb 29, 2016).
|
||||
.if ${BOOTSTRAPPING} != 0 && \
|
||||
${WANT_COMPILER_TYPE} == "clang" && ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} < 30601
|
||||
.if ${BOOTSTRAPPING} > 10000000 && ${BOOTSTRAPPING} < 1002501
|
||||
@echo "ERROR: Source upgrades from stable/10 prior to r286033 are not supported."; false
|
||||
.elif ${BOOTSTRAPPING} > 9000000 && ${BOOTSTRAPPING} < 903509
|
||||
@echo "ERROR: Source upgrades from stable/9 prior to r286035 are not supported."; false
|
||||
.endif
|
||||
.endif
|
||||
.if ${BOOTSTRAPPING} < ${MINIMUM_SUPPORTED_OSREL} && ${BOOTSTRAPPING} != 0
|
||||
@echo "ERROR: Source upgrades from versions prior to ${MINIMUM_SUPPORTED_REL} are not supported."; \
|
||||
false
|
||||
.endif
|
||||
|
||||
.for _tool in tools/build ${_elftoolchain_libs}
|
||||
${_+_}@${ECHODIR} "===> ${_tool} (obj,includes,all,install)"; \
|
||||
cd ${.CURDIR}/${_tool}; \
|
||||
|
17
UPDATING
17
UPDATING
@ -41,13 +41,22 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 12.x IS SLOW:
|
||||
11.0-RELEASE). These revisions post-date the 10.2 and 9.3 releases, so
|
||||
you'll need to take the unusual step of upgrading to the tip of the
|
||||
stable branch before moving to 11 or -current via a source upgrade.
|
||||
stable/11 and 11.0-RELEASE post-date the fix so you can move from them
|
||||
to -current. This differs from the historical situation where one could
|
||||
upgrade from anywhere on the last couple of stable branches, so be
|
||||
careful.
|
||||
stable/11 and 11.0-RELEASE have working newer compiler. This differs
|
||||
from the historical situation where one could upgrade from anywhere on
|
||||
the last couple of stable branches, so be careful.
|
||||
|
||||
If you're running a hybrid system on 9.x or 10.x with an updated clang
|
||||
compiler or are using an supported external toolchain, the build system
|
||||
will allow the upgrade. Otherwise it will print a reminder.
|
||||
|
||||
****************************** SPECIAL WARNING: ******************************
|
||||
|
||||
20161030:
|
||||
isl(4) and cyapa(4) drivers now require a new driver,
|
||||
chromebook_platform(4), to work properly on Chromebook-class hardware.
|
||||
On other types of hardware the drivers may need to be configured using
|
||||
device hints. Please see the corresponding manual pages for details.
|
||||
|
||||
20161017:
|
||||
The urtwn(4) driver was merged into rtwn(4) and now consists of
|
||||
rtwn(4) main module + rtwn_usb(4) and rtwn_pci(4) bus-specific
|
||||
|
@ -213,6 +213,7 @@ extern int zpool_get_state(zpool_handle_t *);
|
||||
extern const char *zpool_state_to_name(vdev_state_t, vdev_aux_t);
|
||||
extern const char *zpool_pool_state_to_name(pool_state_t);
|
||||
extern void zpool_free_handles(libzfs_handle_t *);
|
||||
extern int zpool_nextboot(libzfs_handle_t *, uint64_t, uint64_t, const char *);
|
||||
|
||||
/*
|
||||
* Iterate over all active pools in the system.
|
||||
|
@ -4126,3 +4126,25 @@ zvol_check_dump_config(char *arg)
|
||||
libzfs_fini(hdl);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
int
|
||||
zpool_nextboot(libzfs_handle_t *hdl, uint64_t pool_guid, uint64_t dev_guid,
|
||||
const char *command)
|
||||
{
|
||||
zfs_cmd_t zc = { 0 };
|
||||
nvlist_t *args;
|
||||
char *packed;
|
||||
size_t size;
|
||||
int error;
|
||||
|
||||
args = fnvlist_alloc();
|
||||
fnvlist_add_uint64(args, ZPOOL_CONFIG_POOL_GUID, pool_guid);
|
||||
fnvlist_add_uint64(args, ZPOOL_CONFIG_GUID, dev_guid);
|
||||
fnvlist_add_string(args, "command", command);
|
||||
error = zcmd_write_src_nvlist(hdl, &zc, args);
|
||||
if (error == 0)
|
||||
error = ioctl(hdl->libzfs_fd, ZFS_IOC_NEXTBOOT, &zc);
|
||||
zcmd_free_nvlists(&zc);
|
||||
nvlist_free(args);
|
||||
return (error);
|
||||
}
|
||||
|
@ -1103,7 +1103,7 @@ case "${targ}" in
|
||||
want64=true
|
||||
;;
|
||||
#endif
|
||||
powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \
|
||||
powerpc-*-*bsd* | powerpcspe-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \
|
||||
powerpc-*-solaris2* | powerpc-*-linux-* | powerpc-*-rtems* | \
|
||||
powerpc-*-chorus*)
|
||||
targ_defvec=bfd_elf32_powerpc_vec
|
||||
|
@ -288,7 +288,7 @@ parse_secparams(struct asn_buf *b, struct snmp_pdu *pdu)
|
||||
memset(buf, 0, 256);
|
||||
tb.asn_ptr = buf;
|
||||
tb.asn_len = 256;
|
||||
u_int len;
|
||||
u_int len = 256;
|
||||
|
||||
if (asn_get_octetstring(b, buf, &len) != ASN_ERR_OK) {
|
||||
snmp_error("cannot parse usm header");
|
||||
|
@ -1529,6 +1529,22 @@ print_version(void)
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare the ending of s with end.
|
||||
*/
|
||||
static int
|
||||
strrcmp(const char *s, const char *end)
|
||||
{
|
||||
size_t endlen, slen;
|
||||
|
||||
slen = strlen(s);
|
||||
endlen = strlen(end);
|
||||
|
||||
if (slen >= endlen)
|
||||
s += slen - endlen;
|
||||
return (strcmp(s, end));
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
@ -1562,12 +1578,16 @@ main(int argc, char **argv)
|
||||
if ((ecp->progname = ELFTC_GETPROGNAME()) == NULL)
|
||||
ecp->progname = "elfcopy";
|
||||
|
||||
if (strcmp(ecp->progname, "strip") == 0)
|
||||
if (strrcmp(ecp->progname, "strip") == 0)
|
||||
strip_main(ecp, argc, argv);
|
||||
else if (strcmp(ecp->progname, "mcs") == 0)
|
||||
else if (strrcmp(ecp->progname, "mcs") == 0)
|
||||
mcs_main(ecp, argc, argv);
|
||||
else
|
||||
else {
|
||||
if (strrcmp(ecp->progname, "elfcopy") != 0 &&
|
||||
strrcmp(ecp->progname, "objcopy") != 0)
|
||||
warnx("program mode not known, defaulting to elfcopy");
|
||||
elfcopy_main(ecp, argc, argv);
|
||||
}
|
||||
|
||||
free_sec_add(ecp);
|
||||
free_sec_act(ecp);
|
||||
|
@ -48,12 +48,6 @@
|
||||
|
||||
ELFTC_VCSID("$Id: strings.c 3446 2016-05-03 01:31:17Z emaste $");
|
||||
|
||||
enum return_code {
|
||||
RETURN_OK,
|
||||
RETURN_NOINPUT,
|
||||
RETURN_SOFTWARE
|
||||
};
|
||||
|
||||
enum radix_style {
|
||||
RADIX_DECIMAL,
|
||||
RADIX_HEX,
|
||||
@ -107,7 +101,7 @@ main(int argc, char **argv)
|
||||
{
|
||||
int ch, rc;
|
||||
|
||||
rc = RETURN_OK;
|
||||
rc = 0;
|
||||
min_len = 0;
|
||||
encoding_size = 1;
|
||||
if (elf_version(EV_CURRENT) == EV_NONE)
|
||||
@ -197,7 +191,8 @@ main(int argc, char **argv)
|
||||
if (!*argv)
|
||||
rc = handle_file("{standard input}");
|
||||
else while (*argv) {
|
||||
rc = handle_file(*argv);
|
||||
if (handle_file(*argv) != 0)
|
||||
rc = 1;
|
||||
argv++;
|
||||
}
|
||||
return (rc);
|
||||
@ -209,11 +204,11 @@ handle_file(const char *name)
|
||||
int fd, rt;
|
||||
|
||||
if (name == NULL)
|
||||
return (RETURN_NOINPUT);
|
||||
return (1);
|
||||
if (strcmp("{standard input}", name) != 0) {
|
||||
if (freopen(name, "rb", stdin) == NULL) {
|
||||
warnx("'%s': %s", name, strerror(errno));
|
||||
return (RETURN_NOINPUT);
|
||||
return (1);
|
||||
}
|
||||
} else {
|
||||
return (find_strings(name, (off_t)0, (off_t)0));
|
||||
@ -221,7 +216,7 @@ handle_file(const char *name)
|
||||
|
||||
fd = fileno(stdin);
|
||||
if (fd < 0)
|
||||
return (RETURN_NOINPUT);
|
||||
return (1);
|
||||
rt = handle_elf(name, fd);
|
||||
return (rt);
|
||||
}
|
||||
@ -239,7 +234,7 @@ handle_binary(const char *name, int fd)
|
||||
(void) lseek(fd, (off_t)0, SEEK_SET);
|
||||
if (!fstat(fd, &buf))
|
||||
return (find_strings(name, (off_t)0, buf.st_size));
|
||||
return (RETURN_SOFTWARE);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -257,7 +252,7 @@ handle_elf(const char *name, int fd)
|
||||
Elf_Scn *scn;
|
||||
int rc;
|
||||
|
||||
rc = RETURN_OK;
|
||||
rc = 0;
|
||||
/* If entire file is chosen, treat it as a binary file */
|
||||
if (entire_file)
|
||||
return (handle_binary(name, fd));
|
||||
@ -272,7 +267,7 @@ handle_elf(const char *name, int fd)
|
||||
if (gelf_getehdr(elf, &elfhdr) == NULL) {
|
||||
(void) elf_end(elf);
|
||||
warnx("%s: ELF file could not be processed", name);
|
||||
return (RETURN_SOFTWARE);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (elfhdr.e_shnum == 0 && elfhdr.e_type == ET_CORE) {
|
||||
@ -352,7 +347,7 @@ find_strings(const char *name, off_t offset, off_t size)
|
||||
if ((obuf = (char*)calloc(1, min_len + 1)) == NULL) {
|
||||
(void) fprintf(stderr, "Unable to allocate memory: %s\n",
|
||||
strerror(errno));
|
||||
return (RETURN_SOFTWARE);
|
||||
return (1);
|
||||
}
|
||||
|
||||
(void) fseeko(stdin, offset, SEEK_SET);
|
||||
@ -426,7 +421,7 @@ find_strings(const char *name, off_t offset, off_t size)
|
||||
}
|
||||
_exit1:
|
||||
free(obuf);
|
||||
return (RETURN_OK);
|
||||
return (0);
|
||||
}
|
||||
|
||||
#define USAGE_MESSAGE "\
|
||||
|
77
contrib/gcc/config/rs6000/freebsdspe.h
Normal file
77
contrib/gcc/config/rs6000/freebsdspe.h
Normal file
@ -0,0 +1,77 @@
|
||||
/* Definitions of target machine for GNU compiler,
|
||||
for PowerPC e500 machines running FreeBSD.
|
||||
Based on linuxspe.h
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
Contributed by Aldy Hernandez (aldy@quesejoda.com).
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation; either version 2, or (at your
|
||||
option) any later version.
|
||||
|
||||
GCC 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 General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GCC; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
#undef TARGET_VERSION
|
||||
#define TARGET_VERSION fprintf (stderr, " (PowerPC E500 FreeBSD)");
|
||||
|
||||
/* Override rs6000.h and sysv4.h definition. */
|
||||
#undef TARGET_DEFAULT
|
||||
#define TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_STRICT_ALIGN)
|
||||
|
||||
#undef TARGET_SPE_ABI
|
||||
#undef TARGET_SPE
|
||||
#undef TARGET_E500
|
||||
#undef TARGET_ISEL
|
||||
#undef TARGET_FPRS
|
||||
#undef TARGET_E500_SINGLE
|
||||
#undef TARGET_E500_DOUBLE
|
||||
|
||||
#define TARGET_SPE_ABI rs6000_spe_abi
|
||||
#define TARGET_SPE rs6000_spe
|
||||
#define TARGET_E500 (rs6000_cpu == PROCESSOR_PPC8540)
|
||||
#define TARGET_ISEL rs6000_isel
|
||||
#define TARGET_FPRS (rs6000_float_gprs == 0)
|
||||
#define TARGET_E500_SINGLE (TARGET_HARD_FLOAT && rs6000_float_gprs == 1)
|
||||
#define TARGET_E500_DOUBLE (TARGET_HARD_FLOAT && rs6000_float_gprs == 2)
|
||||
|
||||
#undef SUBSUBTARGET_OVERRIDE_OPTIONS
|
||||
#define SUBSUBTARGET_OVERRIDE_OPTIONS \
|
||||
if (rs6000_select[1].string == NULL) \
|
||||
rs6000_cpu = PROCESSOR_PPC8540; \
|
||||
if (!rs6000_explicit_options.abi) \
|
||||
rs6000_spe_abi = 1; \
|
||||
if (!rs6000_explicit_options.float_gprs) \
|
||||
rs6000_float_gprs = 1; \
|
||||
/* See note below. */ \
|
||||
/*if (!rs6000_explicit_options.long_double)*/ \
|
||||
/* rs6000_long_double_type_size = 128;*/ \
|
||||
if (!rs6000_explicit_options.spe) \
|
||||
rs6000_spe = 1; \
|
||||
if (!rs6000_explicit_options.isel) \
|
||||
rs6000_isel = 1; \
|
||||
if (target_flags & MASK_64BIT) \
|
||||
error ("-m64 not supported in this configuration")
|
||||
|
||||
/* The e500 ABI says that either long doubles are 128 bits, or if
|
||||
implemented in any other size, the compiler/linker should error out.
|
||||
We have no emulation libraries for 128 bit long doubles, and I hate
|
||||
the dozens of failures on the regression suite. So I'm breaking ABI
|
||||
specifications, until I properly fix the emulation.
|
||||
|
||||
Enable these later.
|
||||
#undef CPP_LONGDOUBLE_DEFAULT_SPEC
|
||||
#define CPP_LONGDOUBLE_DEFAULT_SPEC "-D__LONG_DOUBLE_128__=1"
|
||||
*/
|
||||
|
||||
#undef ASM_DEFAULT_SPEC
|
||||
#define ASM_DEFAULT_SPEC "-mppc -mspe -me500"
|
@ -1,3 +1,6 @@
|
||||
Oct 23, 2016: libarchive 3.2.2 released
|
||||
Security release
|
||||
|
||||
Jun 20, 2016: libarchive 3.2.1 released
|
||||
This fixes a handful of security and other critical issues with 3.2.0
|
||||
|
||||
|
@ -129,6 +129,13 @@
|
||||
# include <crtdbg.h>
|
||||
#endif
|
||||
|
||||
mode_t umasked(mode_t expected_mode)
|
||||
{
|
||||
mode_t mode = umask(0);
|
||||
umask(mode);
|
||||
return expected_mode & ~mode;
|
||||
}
|
||||
|
||||
/* Path to working directory for current test */
|
||||
const char *testworkdir;
|
||||
#ifdef PROGRAM
|
||||
@ -1156,6 +1163,35 @@ assertion_file_contains_lines_any_order(const char *file, int line,
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Verify that a text file does not contains the specified strings */
|
||||
int
|
||||
assertion_file_contains_no_invalid_strings(const char *file, int line,
|
||||
const char *pathname, const char *strings[])
|
||||
{
|
||||
char *buff;
|
||||
int i;
|
||||
|
||||
buff = slurpfile(NULL, "%s", pathname);
|
||||
if (buff == NULL) {
|
||||
failure_start(file, line, "Can't read file: %s", pathname);
|
||||
failure_finish(NULL);
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (i = 0; strings[i] != NULL; ++i) {
|
||||
if (strstr(buff, strings[i]) != NULL) {
|
||||
failure_start(file, line, "Invalid string in %s: %s", pathname,
|
||||
strings[i]);
|
||||
failure_finish(NULL);
|
||||
free(buff);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
free(buff);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Test that two paths point to the same file. */
|
||||
/* As a side-effect, asserts that both files exist. */
|
||||
static int
|
||||
@ -1293,6 +1329,11 @@ assertion_file_time(const char *file, int line,
|
||||
switch (type) {
|
||||
case 'a': filet_nsec = st.st_atimespec.tv_nsec; break;
|
||||
case 'b': filet = st.st_birthtime;
|
||||
/* FreeBSD filesystems that don't support birthtime
|
||||
* (e.g., UFS1) always return -1 here. */
|
||||
if (filet == -1) {
|
||||
return (1);
|
||||
}
|
||||
filet_nsec = st.st_birthtimespec.tv_nsec; break;
|
||||
case 'm': filet_nsec = st.st_mtimespec.tv_nsec; break;
|
||||
default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
|
||||
@ -1370,6 +1411,8 @@ assertion_file_mode(const char *file, int line, const char *pathname, int expect
|
||||
assertion_count(file, line);
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
failure_start(file, line, "assertFileMode not yet implemented for Windows");
|
||||
(void)mode; /* UNUSED */
|
||||
(void)r; /* UNUSED */
|
||||
#else
|
||||
{
|
||||
struct stat st;
|
||||
@ -1424,7 +1467,7 @@ assertion_file_nlinks(const char *file, int line,
|
||||
assertion_count(file, line);
|
||||
r = lstat(pathname, &st);
|
||||
if (r == 0 && (int)st.st_nlink == nlinks)
|
||||
return (1);
|
||||
return (1);
|
||||
failure_start(file, line, "File %s has %d links, expected %d",
|
||||
pathname, st.st_nlink, nlinks);
|
||||
failure_finish(NULL);
|
||||
@ -1660,6 +1703,7 @@ assertion_make_file(const char *file, int line,
|
||||
if (0 != chmod(path, mode)) {
|
||||
failure_start(file, line, "Could not chmod %s", path);
|
||||
failure_finish(NULL);
|
||||
close(fd);
|
||||
return (0);
|
||||
}
|
||||
if (contents != NULL) {
|
||||
@ -1674,6 +1718,7 @@ assertion_make_file(const char *file, int line,
|
||||
failure_start(file, line,
|
||||
"Could not write to %s", path);
|
||||
failure_finish(NULL);
|
||||
close(fd);
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
@ -174,6 +174,9 @@
|
||||
/* Assert that file contents match a string. */
|
||||
#define assertFileContents(data, data_size, pathname) \
|
||||
assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
|
||||
/* Verify that a file does not contain invalid strings */
|
||||
#define assertFileContainsNoInvalidStrings(pathname, strings) \
|
||||
assertion_file_contains_no_invalid_strings(__FILE__, __LINE__, pathname, strings)
|
||||
#define assertFileMtime(pathname, sec, nsec) \
|
||||
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileMtimeRecent(pathname) \
|
||||
@ -182,6 +185,8 @@
|
||||
assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
|
||||
#define assertFileSize(pathname, size) \
|
||||
assertion_file_size(__FILE__, __LINE__, pathname, size)
|
||||
#define assertFileMode(pathname, mode) \
|
||||
assertion_file_mode(__FILE__, __LINE__, pathname, mode)
|
||||
#define assertTextFileContents(text, pathname) \
|
||||
assertion_text_file_contents(__FILE__, __LINE__, text, pathname)
|
||||
#define assertFileContainsLinesAnyOrder(pathname, lines) \
|
||||
@ -239,6 +244,7 @@ int assertion_file_atime_recent(const char *, int, const char *);
|
||||
int assertion_file_birthtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_birthtime_recent(const char *, int, const char *);
|
||||
int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
|
||||
int assertion_file_contains_no_invalid_strings(const char *, int, const char *, const char **);
|
||||
int assertion_file_contents(const char *, int, const void *, int, const char *);
|
||||
int assertion_file_exists(const char *, int, const char *);
|
||||
int assertion_file_mode(const char *, int, const char *, int);
|
||||
@ -327,6 +333,9 @@ void copy_reference_file(const char *);
|
||||
*/
|
||||
void extract_reference_files(const char **);
|
||||
|
||||
/* Subtract umask from mode */
|
||||
mode_t umasked(mode_t expected_mode);
|
||||
|
||||
/* Path to working directory for current test */
|
||||
extern const char *testworkdir;
|
||||
|
||||
|
@ -1164,6 +1164,35 @@ assertion_file_contains_lines_any_order(const char *file, int line,
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Verify that a text file does not contains the specified strings */
|
||||
int
|
||||
assertion_file_contains_no_invalid_strings(const char *file, int line,
|
||||
const char *pathname, const char *strings[])
|
||||
{
|
||||
char *buff;
|
||||
int i;
|
||||
|
||||
buff = slurpfile(NULL, "%s", pathname);
|
||||
if (buff == NULL) {
|
||||
failure_start(file, line, "Can't read file: %s", pathname);
|
||||
failure_finish(NULL);
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (i = 0; strings[i] != NULL; ++i) {
|
||||
if (strstr(buff, strings[i]) != NULL) {
|
||||
failure_start(file, line, "Invalid string in %s: %s", pathname,
|
||||
strings[i]);
|
||||
failure_finish(NULL);
|
||||
free(buff);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
free(buff);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Test that two paths point to the same file. */
|
||||
/* As a side-effect, asserts that both files exist. */
|
||||
static int
|
||||
@ -1383,6 +1412,8 @@ assertion_file_mode(const char *file, int line, const char *pathname, int expect
|
||||
assertion_count(file, line);
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
failure_start(file, line, "assertFileMode not yet implemented for Windows");
|
||||
(void)mode; /* UNUSED */
|
||||
(void)r; /* UNUSED */
|
||||
#else
|
||||
{
|
||||
struct stat st;
|
||||
|
@ -174,6 +174,9 @@
|
||||
/* Assert that file contents match a string. */
|
||||
#define assertFileContents(data, data_size, pathname) \
|
||||
assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
|
||||
/* Verify that a file does not contain invalid strings */
|
||||
#define assertFileContainsNoInvalidStrings(pathname, strings) \
|
||||
assertion_file_contains_no_invalid_strings(__FILE__, __LINE__, pathname, strings)
|
||||
#define assertFileMtime(pathname, sec, nsec) \
|
||||
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileMtimeRecent(pathname) \
|
||||
@ -241,6 +244,7 @@ int assertion_file_atime_recent(const char *, int, const char *);
|
||||
int assertion_file_birthtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_birthtime_recent(const char *, int, const char *);
|
||||
int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
|
||||
int assertion_file_contains_no_invalid_strings(const char *, int, const char *, const char **);
|
||||
int assertion_file_contents(const char *, int, const void *, int, const char *);
|
||||
int assertion_file_exists(const char *, int, const char *);
|
||||
int assertion_file_mode(const char *, int, const char *, int);
|
||||
|
@ -36,7 +36,7 @@
|
||||
* assert that ARCHIVE_VERSION_NUMBER >= 2012108.
|
||||
*/
|
||||
/* Note: Compiler will complain if this does not match archive_entry.h! */
|
||||
#define ARCHIVE_VERSION_NUMBER 3002001
|
||||
#define ARCHIVE_VERSION_NUMBER 3002002
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <stddef.h> /* for wchar_t */
|
||||
@ -155,7 +155,7 @@ __LA_DECL int archive_version_number(void);
|
||||
/*
|
||||
* Textual name/version of the library, useful for version displays.
|
||||
*/
|
||||
#define ARCHIVE_VERSION_ONLY_STRING "3.2.1"
|
||||
#define ARCHIVE_VERSION_ONLY_STRING "3.2.2"
|
||||
#define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING
|
||||
__LA_DECL const char * archive_version_string(void);
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
#define ARCHIVE_ENTRY_H_INCLUDED
|
||||
|
||||
/* Note: Compiler will complain if this does not match archive.h! */
|
||||
#define ARCHIVE_VERSION_NUMBER 3002001
|
||||
#define ARCHIVE_VERSION_NUMBER 3002002
|
||||
|
||||
/*
|
||||
* Note: archive_entry.h is for use outside of libarchive; the
|
||||
|
@ -1162,6 +1162,35 @@ assertion_file_contains_lines_any_order(const char *file, int line,
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Verify that a text file does not contains the specified strings */
|
||||
int
|
||||
assertion_file_contains_no_invalid_strings(const char *file, int line,
|
||||
const char *pathname, const char *strings[])
|
||||
{
|
||||
char *buff;
|
||||
int i;
|
||||
|
||||
buff = slurpfile(NULL, "%s", pathname);
|
||||
if (buff == NULL) {
|
||||
failure_start(file, line, "Can't read file: %s", pathname);
|
||||
failure_finish(NULL);
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (i = 0; strings[i] != NULL; ++i) {
|
||||
if (strstr(buff, strings[i]) != NULL) {
|
||||
failure_start(file, line, "Invalid string in %s: %s", pathname,
|
||||
strings[i]);
|
||||
failure_finish(NULL);
|
||||
free(buff);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
free(buff);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Test that two paths point to the same file. */
|
||||
/* As a side-effect, asserts that both files exist. */
|
||||
static int
|
||||
@ -1381,6 +1410,8 @@ assertion_file_mode(const char *file, int line, const char *pathname, int expect
|
||||
assertion_count(file, line);
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
failure_start(file, line, "assertFileMode not yet implemented for Windows");
|
||||
(void)mode; /* UNUSED */
|
||||
(void)r; /* UNUSED */
|
||||
#else
|
||||
{
|
||||
struct stat st;
|
||||
|
@ -174,6 +174,9 @@
|
||||
/* Assert that file contents match a string. */
|
||||
#define assertFileContents(data, data_size, pathname) \
|
||||
assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
|
||||
/* Verify that a file does not contain invalid strings */
|
||||
#define assertFileContainsNoInvalidStrings(pathname, strings) \
|
||||
assertion_file_contains_no_invalid_strings(__FILE__, __LINE__, pathname, strings)
|
||||
#define assertFileMtime(pathname, sec, nsec) \
|
||||
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
|
||||
#define assertFileMtimeRecent(pathname) \
|
||||
@ -241,6 +244,7 @@ int assertion_file_atime_recent(const char *, int, const char *);
|
||||
int assertion_file_birthtime(const char *, int, const char *, long, long);
|
||||
int assertion_file_birthtime_recent(const char *, int, const char *);
|
||||
int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
|
||||
int assertion_file_contains_no_invalid_strings(const char *, int, const char *, const char **);
|
||||
int assertion_file_contents(const char *, int, const void *, int, const char *);
|
||||
int assertion_file_exists(const char *, int, const char *);
|
||||
int assertion_file_mode(const char *, int, const char *, int);
|
||||
|
@ -33,6 +33,11 @@ DEFINE_TEST(test_read_format_mtree_crash747)
|
||||
const char *reffile = "test_read_format_mtree_crash747.mtree.bz2";
|
||||
struct archive *a;
|
||||
|
||||
if (archive_bzlib_version() == NULL) {
|
||||
skipping("This test requires bzlib");
|
||||
return;
|
||||
}
|
||||
|
||||
extract_reference_file(reffile);
|
||||
|
||||
assert((a = archive_read_new()) != NULL);
|
||||
|
@ -50,6 +50,11 @@ DEFINE_TEST(test_read_format_zip_high_compression)
|
||||
size_t s;
|
||||
int64_t o;
|
||||
|
||||
if (archive_zlib_version() == NULL) {
|
||||
skipping("Zip compression test requires zlib");
|
||||
return;
|
||||
}
|
||||
|
||||
extract_reference_file(refname);
|
||||
p = slurpfile(&archive_size, refname);
|
||||
|
||||
@ -82,6 +87,11 @@ DEFINE_TEST(test_read_format_zip_high_compression2)
|
||||
char *body, *body_read, *buff;
|
||||
int n;
|
||||
|
||||
if (archive_zlib_version() == NULL) {
|
||||
skipping("Zip compression test requires zlib");
|
||||
return;
|
||||
}
|
||||
|
||||
assert((body = malloc(body_size)) != NULL);
|
||||
assert((body_read = malloc(body_size)) != NULL);
|
||||
assert((buff = malloc(buff_size)) != NULL);
|
||||
|
@ -133,11 +133,12 @@ DEFINE_TEST(test_read_append_filter)
|
||||
assert((a = archive_read_new()) != NULL);
|
||||
assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
|
||||
r = archive_read_append_filter(a, ARCHIVE_FILTER_GZIP);
|
||||
if (r == ARCHIVE_WARN && !canGzip()) {
|
||||
skipping("gzip reading not fully supported on this platform");
|
||||
if (r != ARCHIVE_OK && archive_zlib_version() == NULL && !canGzip()) {
|
||||
skipping("gzip tests require zlib or working gzip command");
|
||||
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
||||
return;
|
||||
}
|
||||
assertEqualIntA(a, ARCHIVE_OK, r);
|
||||
assertEqualInt(ARCHIVE_OK,
|
||||
archive_read_open_memory(a, archive, sizeof(archive)));
|
||||
assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae));
|
||||
@ -200,8 +201,11 @@ DEFINE_TEST(test_read_append_filter_wrong_program)
|
||||
{
|
||||
struct archive_entry *ae;
|
||||
struct archive *a;
|
||||
#if !defined(_WIN32) || defined(__CYGWIN__)
|
||||
FILE * fp;
|
||||
int fd;
|
||||
fpos_t pos;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If we have "bunzip2 -q", try using that.
|
||||
@ -211,11 +215,13 @@ DEFINE_TEST(test_read_append_filter_wrong_program)
|
||||
return;
|
||||
}
|
||||
|
||||
#if !defined(_WIN32) || defined(__CYGWIN__)
|
||||
/* bunzip2 will write to stderr, redirect it to a file */
|
||||
fflush(stderr);
|
||||
fgetpos(stderr, &pos);
|
||||
fd = dup(fileno(stderr));
|
||||
freopen("stderr1", "w", stderr);
|
||||
fp = freopen("stderr1", "w", stderr);
|
||||
#endif
|
||||
|
||||
assert((a = archive_read_new()) != NULL);
|
||||
assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_TAR));
|
||||
@ -227,12 +233,15 @@ DEFINE_TEST(test_read_append_filter_wrong_program)
|
||||
assertEqualIntA(a, ARCHIVE_WARN, archive_read_close(a));
|
||||
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
|
||||
|
||||
/* restore stderr */
|
||||
fflush(stderr);
|
||||
dup2(fd, fileno(stderr));
|
||||
close(fd);
|
||||
clearerr(stderr);
|
||||
fsetpos(stderr, &pos);
|
||||
|
||||
#if !defined(_WIN32) || defined(__CYGWIN__)
|
||||
/* restore stderr and verify results */
|
||||
if (fp != NULL) {
|
||||
fflush(stderr);
|
||||
dup2(fd, fileno(stderr));
|
||||
close(fd);
|
||||
clearerr(stderr);
|
||||
fsetpos(stderr, &pos);
|
||||
}
|
||||
assertTextFileContents("bunzip2: (stdin) is not a bzip2 file.\n", "stderr1");
|
||||
#endif
|
||||
}
|
||||
|
@ -117,8 +117,8 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
*/
|
||||
dirname[0] = '\0';
|
||||
strcpy(dir, "/dir0");
|
||||
for (i = 0; i < 10; i++) {
|
||||
dir[4] = '0' + i;
|
||||
for (i = 0; i < 13; i++) {
|
||||
dir[4] = "0123456789ABCDEF"[i];
|
||||
if (i == 0)
|
||||
strcat(dirname, dir+1);
|
||||
else
|
||||
@ -134,6 +134,19 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
archive_entry_free(ae);
|
||||
}
|
||||
|
||||
strcat(dirname, "/file");
|
||||
assert((ae = archive_entry_new()) != NULL);
|
||||
archive_entry_set_atime(ae, 2, 20);
|
||||
archive_entry_set_birthtime(ae, 3, 30);
|
||||
archive_entry_set_ctime(ae, 4, 40);
|
||||
archive_entry_set_mtime(ae, 5, 50);
|
||||
archive_entry_copy_pathname(ae, dirname);
|
||||
archive_entry_set_mode(ae, S_IFREG | 0755);
|
||||
archive_entry_set_size(ae, 8);
|
||||
assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
|
||||
archive_entry_free(ae);
|
||||
assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
|
||||
|
||||
/*
|
||||
* "dir0/dir1/file1" has 8 bytes of data.
|
||||
*/
|
||||
@ -332,6 +345,45 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assert((S_IFDIR | 0555) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(2, archive_entry_atime(ae));
|
||||
assertEqualInt(3, archive_entry_birthtime(ae));
|
||||
assertEqualInt(4, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0555) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(2, archive_entry_atime(ae));
|
||||
assertEqualInt(3, archive_entry_birthtime(ae));
|
||||
assertEqualInt(4, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0555) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(2, archive_entry_atime(ae));
|
||||
assertEqualInt(3, archive_entry_birthtime(ae));
|
||||
assertEqualInt(4, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0555) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "hardlnk"
|
||||
*/
|
||||
@ -385,6 +437,21 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(2, archive_entry_atime(ae));
|
||||
assertEqualInt(3, archive_entry_birthtime(ae));
|
||||
assertEqualInt(4, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file", archive_entry_pathname(ae));
|
||||
assert((AE_IFREG | 0555) == archive_entry_mode(ae));
|
||||
assertEqualInt(1, archive_entry_nlink(ae));
|
||||
assertEqualInt(8, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/file1"
|
||||
*/
|
||||
@ -580,18 +647,40 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "hardlnk"
|
||||
* Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("hardlnk", archive_entry_pathname(ae));
|
||||
assert((AE_IFREG | 0400) == archive_entry_mode(ae));
|
||||
assertEqualInt(2, archive_entry_nlink(ae));
|
||||
assertEqualInt(8, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0700) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0700) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0700) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "file"
|
||||
@ -601,8 +690,22 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("file", archive_entry_pathname(ae));
|
||||
assertEqualString("hardlnk", archive_entry_hardlink(ae));
|
||||
assert((AE_IFREG | 0400) == archive_entry_mode(ae));
|
||||
assertEqualInt(8, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "hardlnk"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("hardlnk", archive_entry_pathname(ae));
|
||||
assertEqualString("file", archive_entry_hardlink(ae));
|
||||
assert((AE_IFREG | 0400) == archive_entry_mode(ae));
|
||||
assertEqualInt(2, archive_entry_nlink(ae));
|
||||
assertEqualInt(0, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
|
||||
|
||||
@ -624,6 +727,22 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString(
|
||||
"dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file",
|
||||
archive_entry_pathname(ae));
|
||||
assert((AE_IFREG | 0400) == archive_entry_mode(ae));
|
||||
assertEqualInt(1, archive_entry_nlink(ae));
|
||||
assertEqualInt(8, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/file1"
|
||||
*/
|
||||
@ -745,6 +864,42 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assert((S_IFDIR | 0700) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "rr_moved/dir7/dir8/dir9/dira"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0700) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "rr_moved/dir7/dir8/dir9/dira/dirB"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0700) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "rr_moved/dir7/dir8/dir9/dirA/dirB/dirC"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB/DIRC",
|
||||
archive_entry_pathname(ae));
|
||||
assert((S_IFDIR | 0700) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "dir0"
|
||||
*/
|
||||
@ -826,6 +981,20 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assert((S_IFDIR | 0700) == archive_entry_mode(ae));
|
||||
assertEqualInt(2048, archive_entry_size(ae));
|
||||
|
||||
/*
|
||||
* Read "hardlink"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("HARDLNK", archive_entry_pathname(ae));
|
||||
assertEqualString(NULL, archive_entry_hardlink(ae));
|
||||
assert((AE_IFREG | 0400) == archive_entry_mode(ae));
|
||||
assertEqualInt(8, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "file"
|
||||
*/
|
||||
@ -835,25 +1004,13 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("FILE", archive_entry_pathname(ae));
|
||||
assertEqualString("HARDLNK", archive_entry_hardlink(ae));
|
||||
assert((AE_IFREG | 0400) == archive_entry_mode(ae));
|
||||
assertEqualInt(2, archive_entry_nlink(ae));
|
||||
assertEqualInt(8, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "hardlink"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString("HARDLNK", archive_entry_pathname(ae));
|
||||
assertEqualString("FILE", archive_entry_hardlink(ae));
|
||||
assert((AE_IFREG | 0400) == archive_entry_mode(ae));
|
||||
assertEqualInt(0, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
|
||||
|
||||
|
||||
/*
|
||||
* Read longname
|
||||
*/
|
||||
@ -870,6 +1027,22 @@ DEFINE_TEST(test_write_format_iso9660)
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "rr_moved/dir7/dir8/dir9/dirA/dirB/dirC/file"
|
||||
*/
|
||||
assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
|
||||
assertEqualInt(5, archive_entry_atime(ae));
|
||||
assertEqualInt(5, archive_entry_ctime(ae));
|
||||
assertEqualInt(5, archive_entry_mtime(ae));
|
||||
assertEqualString(
|
||||
"RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB/DIRC/FILE",
|
||||
archive_entry_pathname(ae));
|
||||
assert((AE_IFREG | 0400) == archive_entry_mode(ae));
|
||||
assertEqualInt(1, archive_entry_nlink(ae));
|
||||
assertEqualInt(8, archive_entry_size(ae));
|
||||
assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
|
||||
assertEqualMem(buff2, "12345678", 8);
|
||||
|
||||
/*
|
||||
* Read "dir0/dir1/file1"
|
||||
*/
|
||||
|
@ -1412,6 +1412,8 @@ assertion_file_mode(const char *file, int line, const char *pathname, int expect
|
||||
assertion_count(file, line);
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
failure_start(file, line, "assertFileMode not yet implemented for Windows");
|
||||
(void)mode; /* UNUSED */
|
||||
(void)r; /* UNUSED */
|
||||
#else
|
||||
{
|
||||
struct stat st;
|
||||
|
@ -33,7 +33,7 @@ DEFINE_TEST(test_option_b)
|
||||
|
||||
assertMakeFile("file1", 0644, "file1");
|
||||
if (systemf("cat file1 > test_cat.out 2> test_cat.err") != 0) {
|
||||
skipping("Platform doesn't have cat");
|
||||
skipping("This test requires a `cat` program");
|
||||
return;
|
||||
}
|
||||
testprog_ustar = malloc(strlen(testprog) + sizeof(USTAR_OPT) + 1);
|
||||
|
@ -63,7 +63,7 @@ DEFINE_TEST(test_symlink_dir)
|
||||
/* "dir2" is a symlink to a non-existing "real_dir2" */
|
||||
assertMakeSymlink("dest1/dir2", "real_dir2");
|
||||
} else {
|
||||
skipping("some symlink checks");
|
||||
skipping("Symlinks are not supported on this platform");
|
||||
}
|
||||
/* "dir3" is a symlink to an existing "non_dir3" */
|
||||
assertMakeFile("dest1/non_dir3", 0755, "abcdef");
|
||||
|
@ -6,7 +6,7 @@
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//
|
||||
// Compatible with libuwind API documented at:
|
||||
// Compatible with libunwind API documented at:
|
||||
// http://www.nongnu.org/libunwind/man/libunwind(3).html
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -120,7 +120,7 @@ extern int unw_init_remote_thread(unw_cursor_t *, unw_addr_space_t, thread_t *);
|
||||
#endif /* UNW_REMOTE */
|
||||
|
||||
/*
|
||||
* traditional libuwind "remote" API
|
||||
* traditional libunwind "remote" API
|
||||
* NOT IMPLEMENTED on Mac OS X
|
||||
*
|
||||
* extern int unw_init_remote(unw_cursor_t*, unw_addr_space_t,
|
||||
|
@ -374,7 +374,7 @@ inline bool LocalAddressSpace::findUnwindSections(pint_t targetAddr,
|
||||
(_Unwind_Ptr) targetAddr, &length);
|
||||
info.arm_section_length = (uintptr_t)length;
|
||||
#endif
|
||||
_LIBUNWIND_TRACE_UNWINDING("findUnwindSections: section %X length %x\n",
|
||||
_LIBUNWIND_TRACE_UNWINDING("findUnwindSections: section %X length %x",
|
||||
info.arm_section, info.arm_section_length);
|
||||
if (info.arm_section && info.arm_section_length)
|
||||
return true;
|
||||
|
@ -105,7 +105,7 @@ int CompactUnwinder_x86<A>::stepWithCompactEncodingEBPFrame(
|
||||
default:
|
||||
(void)functionStart;
|
||||
_LIBUNWIND_DEBUG_LOG("bad register for EBP frame, encoding=%08X for "
|
||||
"function starting at 0x%X\n",
|
||||
"function starting at 0x%X",
|
||||
compactEncoding, functionStart);
|
||||
_LIBUNWIND_ABORT("invalid compact unwind encoding");
|
||||
}
|
||||
@ -224,7 +224,7 @@ int CompactUnwinder_x86<A>::stepWithCompactEncodingFrameless(
|
||||
break;
|
||||
default:
|
||||
_LIBUNWIND_DEBUG_LOG("bad register for frameless, encoding=%08X for "
|
||||
"function starting at 0x%X\n",
|
||||
"function starting at 0x%X",
|
||||
encoding, functionStart);
|
||||
_LIBUNWIND_ABORT("invalid compact unwind encoding");
|
||||
}
|
||||
@ -336,7 +336,7 @@ int CompactUnwinder_x86_64<A>::stepWithCompactEncodingRBPFrame(
|
||||
default:
|
||||
(void)functionStart;
|
||||
_LIBUNWIND_DEBUG_LOG("bad register for RBP frame, encoding=%08X for "
|
||||
"function starting at 0x%llX\n",
|
||||
"function starting at 0x%llX",
|
||||
compactEncoding, functionStart);
|
||||
_LIBUNWIND_ABORT("invalid compact unwind encoding");
|
||||
}
|
||||
@ -455,7 +455,7 @@ int CompactUnwinder_x86_64<A>::stepWithCompactEncodingFrameless(
|
||||
break;
|
||||
default:
|
||||
_LIBUNWIND_DEBUG_LOG("bad register for frameless, encoding=%08X for "
|
||||
"function starting at 0x%llX\n",
|
||||
"function starting at 0x%llX",
|
||||
encoding, functionStart);
|
||||
_LIBUNWIND_ABORT("invalid compact unwind encoding");
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ bool EHHeaderParser<A>::decodeTableEntry(
|
||||
const char *message =
|
||||
CFI_Parser<A>::decodeFDE(addressSpace, fde, fdeInfo, cieInfo);
|
||||
if (message != NULL) {
|
||||
_LIBUNWIND_DEBUG_LOG("EHHeaderParser::decodeTableEntry: bad fde: %s\n",
|
||||
_LIBUNWIND_DEBUG_LOG("EHHeaderParser::decodeTableEntry: bad fde: %s",
|
||||
message);
|
||||
return false;
|
||||
}
|
||||
|
@ -454,7 +454,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
unw_proc_info_t frameInfo;
|
||||
if (unw_get_proc_info(cursor, &frameInfo) != UNW_ESUCCESS) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): unw_get_proc_info "
|
||||
"failed => _URC_FATAL_PHASE1_ERROR\n",
|
||||
"failed => _URC_FATAL_PHASE1_ERROR",
|
||||
static_cast<void *>(exception_object));
|
||||
return _URC_FATAL_PHASE1_ERROR;
|
||||
}
|
||||
@ -472,7 +472,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
unw_get_reg(cursor, UNW_REG_IP, &pc);
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): pc=0x%llX, start_ip=0x%llX, func=%s, "
|
||||
"lsda=0x%llX, personality=0x%llX\n",
|
||||
"lsda=0x%llX, personality=0x%llX",
|
||||
static_cast<void *>(exception_object), (long long)pc,
|
||||
(long long)frameInfo.start_ip, functionName,
|
||||
(long long)frameInfo.lsda, (long long)frameInfo.handler);
|
||||
@ -484,7 +484,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
__personality_routine p =
|
||||
(__personality_routine)(long)(frameInfo.handler);
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): calling personality function %p\n",
|
||||
"unwind_phase1(ex_ojb=%p): calling personality function %p",
|
||||
static_cast<void *>(exception_object),
|
||||
reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(p)));
|
||||
struct _Unwind_Context *context = (struct _Unwind_Context *)(cursor);
|
||||
@ -496,7 +496,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
(*p)(_US_VIRTUAL_UNWIND_FRAME, exception_object, context);
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): personality result %d start_ip %x ehtp %p "
|
||||
"additional %x\n",
|
||||
"additional %x",
|
||||
static_cast<void *>(exception_object), personalityResult,
|
||||
exception_object->pr_cache.fnstart,
|
||||
static_cast<void *>(exception_object->pr_cache.ehtp),
|
||||
@ -508,13 +508,13 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
handlerNotFound = false;
|
||||
// p should have initialized barrier_cache. EHABI #7.3.5
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): _URC_HANDLER_FOUND \n",
|
||||
"unwind_phase1(ex_ojb=%p): _URC_HANDLER_FOUND",
|
||||
static_cast<void *>(exception_object));
|
||||
return _URC_NO_REASON;
|
||||
|
||||
case _URC_CONTINUE_UNWIND:
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): _URC_CONTINUE_UNWIND\n",
|
||||
"unwind_phase1(ex_ojb=%p): _URC_CONTINUE_UNWIND",
|
||||
static_cast<void *>(exception_object));
|
||||
// continue unwinding
|
||||
break;
|
||||
@ -526,7 +526,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
default:
|
||||
// something went wrong
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): _URC_FATAL_PHASE1_ERROR\n",
|
||||
"unwind_phase1(ex_ojb=%p): _URC_FATAL_PHASE1_ERROR",
|
||||
static_cast<void *>(exception_object));
|
||||
return _URC_FATAL_PHASE1_ERROR;
|
||||
}
|
||||
@ -541,13 +541,13 @@ static _Unwind_Reason_Code unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor
|
||||
// See comment at the start of unwind_phase1 regarding VRS integrity.
|
||||
unw_init_local(cursor, uc);
|
||||
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p)\n",
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p)",
|
||||
static_cast<void *>(exception_object));
|
||||
int frame_count = 0;
|
||||
|
||||
// Walk each frame until we reach where search phase said to stop.
|
||||
while (true) {
|
||||
// Ask libuwind to get next frame (skip over first which is
|
||||
// Ask libunwind to get next frame (skip over first which is
|
||||
// _Unwind_RaiseException or _Unwind_Resume).
|
||||
//
|
||||
// Resume only ever makes sense for 1 frame.
|
||||
@ -572,7 +572,7 @@ static _Unwind_Reason_Code unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor
|
||||
unw_get_reg(cursor, UNW_REG_SP, &sp);
|
||||
if (unw_get_proc_info(cursor, &frameInfo) != UNW_ESUCCESS) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): unw_get_proc_info "
|
||||
"failed => _URC_FATAL_PHASE2_ERROR\n",
|
||||
"failed => _URC_FATAL_PHASE2_ERROR",
|
||||
static_cast<void *>(exception_object));
|
||||
return _URC_FATAL_PHASE2_ERROR;
|
||||
}
|
||||
@ -588,7 +588,7 @@ static _Unwind_Reason_Code unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor
|
||||
functionName = ".anonymous.";
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2(ex_ojb=%p): start_ip=0x%llX, func=%s, sp=0x%llX, "
|
||||
"lsda=0x%llX, personality=0x%llX\n",
|
||||
"lsda=0x%llX, personality=0x%llX",
|
||||
static_cast<void *>(exception_object), (long long)frameInfo.start_ip,
|
||||
functionName, (long long)sp, (long long)frameInfo.lsda,
|
||||
(long long)frameInfo.handler);
|
||||
@ -610,7 +610,7 @@ static _Unwind_Reason_Code unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor
|
||||
case _URC_CONTINUE_UNWIND:
|
||||
// Continue unwinding
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2(ex_ojb=%p): _URC_CONTINUE_UNWIND\n",
|
||||
"unwind_phase2(ex_ojb=%p): _URC_CONTINUE_UNWIND",
|
||||
static_cast<void *>(exception_object));
|
||||
// EHABI #7.2
|
||||
if (sp == exception_object->barrier_cache.sp) {
|
||||
@ -621,7 +621,7 @@ static _Unwind_Reason_Code unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor
|
||||
break;
|
||||
case _URC_INSTALL_CONTEXT:
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2(ex_ojb=%p): _URC_INSTALL_CONTEXT\n",
|
||||
"unwind_phase2(ex_ojb=%p): _URC_INSTALL_CONTEXT",
|
||||
static_cast<void *>(exception_object));
|
||||
// Personality routine says to transfer control to landing pad.
|
||||
// We may get control back if landing pad calls _Unwind_Resume().
|
||||
@ -630,7 +630,7 @@ static _Unwind_Reason_Code unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor
|
||||
unw_get_reg(cursor, UNW_REG_IP, &pc);
|
||||
unw_get_reg(cursor, UNW_REG_SP, &sp);
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): re-entering "
|
||||
"user code with ip=0x%llX, sp=0x%llX\n",
|
||||
"user code with ip=0x%llX, sp=0x%llX",
|
||||
static_cast<void *>(exception_object),
|
||||
(long long)pc, (long long)sp);
|
||||
}
|
||||
@ -668,7 +668,7 @@ static _Unwind_Reason_Code unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor
|
||||
/// Called by __cxa_throw. Only returns if there is a fatal error.
|
||||
_LIBUNWIND_EXPORT _Unwind_Reason_Code
|
||||
_Unwind_RaiseException(_Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_RaiseException(ex_obj=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_RaiseException(ex_obj=%p)",
|
||||
static_cast<void *>(exception_object));
|
||||
unw_context_t uc;
|
||||
unw_cursor_t cursor;
|
||||
@ -706,7 +706,7 @@ _LIBUNWIND_EXPORT void _Unwind_Complete(_Unwind_Exception* exception_object) {
|
||||
/// in turn calls _Unwind_Resume_or_Rethrow().
|
||||
_LIBUNWIND_EXPORT void
|
||||
_Unwind_Resume(_Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Resume(ex_obj=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Resume(ex_obj=%p)",
|
||||
static_cast<void *>(exception_object));
|
||||
unw_context_t uc;
|
||||
unw_cursor_t cursor;
|
||||
@ -730,7 +730,7 @@ _Unwind_GetLanguageSpecificData(struct _Unwind_Context *context) {
|
||||
if (unw_get_proc_info(cursor, &frameInfo) == UNW_ESUCCESS)
|
||||
result = (uintptr_t)frameInfo.lsda;
|
||||
_LIBUNWIND_TRACE_API(
|
||||
"_Unwind_GetLanguageSpecificData(context=%p) => 0x%llx\n",
|
||||
"_Unwind_GetLanguageSpecificData(context=%p) => 0x%llx",
|
||||
static_cast<void *>(context), (long long)result);
|
||||
return result;
|
||||
}
|
||||
@ -758,7 +758,7 @@ _Unwind_VRS_Set(_Unwind_Context *context, _Unwind_VRS_RegClass regclass,
|
||||
uint32_t regno, _Unwind_VRS_DataRepresentation representation,
|
||||
void *valuep) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_VRS_Set(context=%p, regclass=%d, reg=%d, "
|
||||
"rep=%d, value=0x%llX)\n",
|
||||
"rep=%d, value=0x%llX)",
|
||||
static_cast<void *>(context), regclass, regno,
|
||||
representation,
|
||||
ValueAsBitPattern(representation, valuep));
|
||||
@ -863,7 +863,7 @@ _Unwind_VRS_Result _Unwind_VRS_Get(
|
||||
_Unwind_VRS_Get_Internal(context, regclass, regno, representation,
|
||||
valuep);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_VRS_Get(context=%p, regclass=%d, reg=%d, "
|
||||
"rep=%d, value=0x%llX, result = %d)\n",
|
||||
"rep=%d, value=0x%llX, result = %d)",
|
||||
static_cast<void *>(context), regclass, regno,
|
||||
representation,
|
||||
ValueAsBitPattern(representation, valuep), result);
|
||||
@ -875,7 +875,7 @@ _Unwind_VRS_Pop(_Unwind_Context *context, _Unwind_VRS_RegClass regclass,
|
||||
uint32_t discriminator,
|
||||
_Unwind_VRS_DataRepresentation representation) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_VRS_Pop(context=%p, regclass=%d, "
|
||||
"discriminator=%d, representation=%d)\n",
|
||||
"discriminator=%d, representation=%d)",
|
||||
static_cast<void *>(context), regclass, discriminator,
|
||||
representation);
|
||||
switch (regclass) {
|
||||
@ -948,7 +948,7 @@ _Unwind_GetRegionStart(struct _Unwind_Context *context) {
|
||||
uintptr_t result = 0;
|
||||
if (unw_get_proc_info(cursor, &frameInfo) == UNW_ESUCCESS)
|
||||
result = (uintptr_t)frameInfo.start_ip;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p) => 0x%llX\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p) => 0x%llX",
|
||||
static_cast<void *>(context), (long long)result);
|
||||
return result;
|
||||
}
|
||||
@ -958,7 +958,7 @@ _Unwind_GetRegionStart(struct _Unwind_Context *context) {
|
||||
// is caught.
|
||||
_LIBUNWIND_EXPORT void
|
||||
_Unwind_DeleteException(_Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)",
|
||||
static_cast<void *>(exception_object));
|
||||
if (exception_object->exception_cleanup != NULL)
|
||||
(*exception_object->exception_cleanup)(_URC_FOREIGN_EXCEPTION_CAUGHT,
|
||||
|
@ -72,7 +72,7 @@ _Unwind_SjLj_Unregister(struct _Unwind_FunctionContext *fc) {
|
||||
static _Unwind_Reason_Code
|
||||
unwind_phase1(struct _Unwind_Exception *exception_object) {
|
||||
_Unwind_FunctionContext_t c = __Unwind_SjLj_GetTopOfFunctionStack();
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1: initial function-context=%p\n", c);
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1: initial function-context=%p", c);
|
||||
|
||||
// walk each frame looking for a place to stop
|
||||
for (bool handlerNotFound = true; handlerNotFound; c = c->prev) {
|
||||
@ -80,17 +80,17 @@ unwind_phase1(struct _Unwind_Exception *exception_object) {
|
||||
// check for no more frames
|
||||
if (c == NULL) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): reached "
|
||||
"bottom => _URC_END_OF_STACK\n",
|
||||
"bottom => _URC_END_OF_STACK",
|
||||
exception_object);
|
||||
return _URC_END_OF_STACK;
|
||||
}
|
||||
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1: function-context=%p\n", c);
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1: function-context=%p", c);
|
||||
// if there is a personality routine, ask it if it will want to stop at this
|
||||
// frame
|
||||
if (c->personality != NULL) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): calling "
|
||||
"personality function %p\n",
|
||||
"personality function %p",
|
||||
exception_object, c->personality);
|
||||
_Unwind_Reason_Code personalityResult = (*c->personality)(
|
||||
1, _UA_SEARCH_PHASE, exception_object->exception_class,
|
||||
@ -102,19 +102,19 @@ unwind_phase1(struct _Unwind_Exception *exception_object) {
|
||||
handlerNotFound = false;
|
||||
exception_object->private_2 = (uintptr_t) c;
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): "
|
||||
"_URC_HANDLER_FOUND\n", exception_object);
|
||||
"_URC_HANDLER_FOUND", exception_object);
|
||||
return _URC_NO_REASON;
|
||||
|
||||
case _URC_CONTINUE_UNWIND:
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): "
|
||||
"_URC_CONTINUE_UNWIND\n", exception_object);
|
||||
"_URC_CONTINUE_UNWIND", exception_object);
|
||||
// continue unwinding
|
||||
break;
|
||||
|
||||
default:
|
||||
// something went wrong
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): _URC_FATAL_PHASE1_ERROR\n",
|
||||
"unwind_phase1(ex_ojb=%p): _URC_FATAL_PHASE1_ERROR",
|
||||
exception_object);
|
||||
return _URC_FATAL_PHASE1_ERROR;
|
||||
}
|
||||
@ -126,18 +126,18 @@ unwind_phase1(struct _Unwind_Exception *exception_object) {
|
||||
|
||||
static _Unwind_Reason_Code
|
||||
unwind_phase2(struct _Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p)\n", exception_object);
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p)", exception_object);
|
||||
|
||||
// walk each frame until we reach where search phase said to stop
|
||||
_Unwind_FunctionContext_t c = __Unwind_SjLj_GetTopOfFunctionStack();
|
||||
while (true) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2s(ex_ojb=%p): context=%p\n",
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2s(ex_ojb=%p): context=%p",
|
||||
exception_object, c);
|
||||
|
||||
// check for no more frames
|
||||
if (c == NULL) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): unw_step() reached "
|
||||
"bottom => _URC_END_OF_STACK\n",
|
||||
"bottom => _URC_END_OF_STACK",
|
||||
exception_object);
|
||||
return _URC_END_OF_STACK;
|
||||
}
|
||||
@ -157,7 +157,7 @@ unwind_phase2(struct _Unwind_Exception *exception_object) {
|
||||
case _URC_CONTINUE_UNWIND:
|
||||
// continue unwinding
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2(ex_ojb=%p): _URC_CONTINUE_UNWIND\n",
|
||||
"unwind_phase2(ex_ojb=%p): _URC_CONTINUE_UNWIND",
|
||||
exception_object);
|
||||
if ((uintptr_t) c == exception_object->private_2) {
|
||||
// phase 1 said we would stop at this frame, but we did not...
|
||||
@ -168,7 +168,7 @@ unwind_phase2(struct _Unwind_Exception *exception_object) {
|
||||
case _URC_INSTALL_CONTEXT:
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): "
|
||||
"_URC_INSTALL_CONTEXT, will resume at "
|
||||
"landing pad %p\n",
|
||||
"landing pad %p",
|
||||
exception_object, c->jbuf[1]);
|
||||
// personality routine says to transfer control to landing pad
|
||||
// we may get control back if landing pad calls _Unwind_Resume()
|
||||
@ -202,7 +202,7 @@ unwind_phase2_forced(struct _Unwind_Exception *exception_object,
|
||||
// get next frame (skip over first which is _Unwind_RaiseException)
|
||||
if (c == NULL) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): unw_step() reached "
|
||||
"bottom => _URC_END_OF_STACK\n",
|
||||
"bottom => _URC_END_OF_STACK",
|
||||
exception_object);
|
||||
return _URC_END_OF_STACK;
|
||||
}
|
||||
@ -214,11 +214,11 @@ unwind_phase2_forced(struct _Unwind_Exception *exception_object,
|
||||
(*stop)(1, action, exception_object->exception_class, exception_object,
|
||||
(struct _Unwind_Context *)c, stop_parameter);
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"stop function returned %d\n",
|
||||
"stop function returned %d",
|
||||
exception_object, stopResult);
|
||||
if (stopResult != _URC_NO_REASON) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"stopped by stop function\n",
|
||||
"stopped by stop function",
|
||||
exception_object);
|
||||
return _URC_FATAL_PHASE2_ERROR;
|
||||
}
|
||||
@ -227,7 +227,7 @@ unwind_phase2_forced(struct _Unwind_Exception *exception_object,
|
||||
if (c->personality != NULL) {
|
||||
__personality_routine p = (__personality_routine) c->personality;
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"calling personality function %p\n",
|
||||
"calling personality function %p",
|
||||
exception_object, p);
|
||||
_Unwind_Reason_Code personalityResult =
|
||||
(*p)(1, action, exception_object->exception_class, exception_object,
|
||||
@ -235,13 +235,13 @@ unwind_phase2_forced(struct _Unwind_Exception *exception_object,
|
||||
switch (personalityResult) {
|
||||
case _URC_CONTINUE_UNWIND:
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"personality returned _URC_CONTINUE_UNWIND\n",
|
||||
"personality returned _URC_CONTINUE_UNWIND",
|
||||
exception_object);
|
||||
// destructors called, continue unwinding
|
||||
break;
|
||||
case _URC_INSTALL_CONTEXT:
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"personality returned _URC_INSTALL_CONTEXT\n",
|
||||
"personality returned _URC_INSTALL_CONTEXT",
|
||||
exception_object);
|
||||
// we may get control back if landing pad calls _Unwind_Resume()
|
||||
__Unwind_SjLj_SetTopOfFunctionStack(c);
|
||||
@ -251,7 +251,7 @@ unwind_phase2_forced(struct _Unwind_Exception *exception_object,
|
||||
// something went wrong
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"personality returned %d, "
|
||||
"_URC_FATAL_PHASE2_ERROR\n",
|
||||
"_URC_FATAL_PHASE2_ERROR",
|
||||
exception_object, personalityResult);
|
||||
return _URC_FATAL_PHASE2_ERROR;
|
||||
}
|
||||
@ -262,7 +262,7 @@ unwind_phase2_forced(struct _Unwind_Exception *exception_object,
|
||||
// call stop function one last time and tell it we've reached the end of the
|
||||
// stack
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): calling stop "
|
||||
"function with _UA_END_OF_STACK\n",
|
||||
"function with _UA_END_OF_STACK",
|
||||
exception_object);
|
||||
_Unwind_Action lastAction =
|
||||
(_Unwind_Action)(_UA_FORCE_UNWIND | _UA_CLEANUP_PHASE | _UA_END_OF_STACK);
|
||||
@ -278,7 +278,7 @@ unwind_phase2_forced(struct _Unwind_Exception *exception_object,
|
||||
/// Called by __cxa_throw. Only returns if there is a fatal error
|
||||
_LIBUNWIND_EXPORT _Unwind_Reason_Code
|
||||
_Unwind_SjLj_RaiseException(struct _Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SjLj_RaiseException(ex_obj=%p)\n", exception_object);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SjLj_RaiseException(ex_obj=%p)", exception_object);
|
||||
|
||||
// mark that this is a non-forced unwind, so _Unwind_Resume() can do the right
|
||||
// thing
|
||||
@ -308,7 +308,7 @@ _Unwind_SjLj_RaiseException(struct _Unwind_Exception *exception_object) {
|
||||
/// __cxa_rethrow() which in turn calls _Unwind_Resume_or_Rethrow()
|
||||
_LIBUNWIND_EXPORT void
|
||||
_Unwind_SjLj_Resume(struct _Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SjLj_Resume(ex_obj=%p)\n", exception_object);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SjLj_Resume(ex_obj=%p)", exception_object);
|
||||
|
||||
if (exception_object->private_1 != 0)
|
||||
unwind_phase2_forced(exception_object,
|
||||
@ -326,7 +326,7 @@ _Unwind_SjLj_Resume(struct _Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_EXPORT _Unwind_Reason_Code
|
||||
_Unwind_SjLj_Resume_or_Rethrow(struct _Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("__Unwind_SjLj_Resume_or_Rethrow(ex_obj=%p), "
|
||||
"private_1=%ld\n",
|
||||
"private_1=%ld",
|
||||
exception_object, exception_object->private_1);
|
||||
// If this is non-forced and a stopping place was found, then this is a
|
||||
// re-throw.
|
||||
@ -350,7 +350,7 @@ _LIBUNWIND_EXPORT uintptr_t
|
||||
_Unwind_GetLanguageSpecificData(struct _Unwind_Context *context) {
|
||||
_Unwind_FunctionContext_t ufc = (_Unwind_FunctionContext_t) context;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetLanguageSpecificData(context=%p) "
|
||||
"=> 0x%0lX\n", context, ufc->lsda);
|
||||
"=> 0x%0lX", context, ufc->lsda);
|
||||
return ufc->lsda;
|
||||
}
|
||||
|
||||
@ -358,7 +358,7 @@ _Unwind_GetLanguageSpecificData(struct _Unwind_Context *context) {
|
||||
/// Called by personality handler during phase 2 to get register values.
|
||||
_LIBUNWIND_EXPORT uintptr_t _Unwind_GetGR(struct _Unwind_Context *context,
|
||||
int index) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetGR(context=%p, reg=%d)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetGR(context=%p, reg=%d)",
|
||||
context, index);
|
||||
_Unwind_FunctionContext_t ufc = (_Unwind_FunctionContext_t) context;
|
||||
return ufc->resumeParameters[index];
|
||||
@ -368,7 +368,7 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetGR(struct _Unwind_Context *context,
|
||||
/// Called by personality handler during phase 2 to alter register values.
|
||||
_LIBUNWIND_EXPORT void _Unwind_SetGR(struct _Unwind_Context *context, int index,
|
||||
uintptr_t new_value) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SetGR(context=%p, reg=%d, value=0x%0lX)\n"
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SetGR(context=%p, reg=%d, value=0x%0lX)"
|
||||
, context, index, new_value);
|
||||
_Unwind_FunctionContext_t ufc = (_Unwind_FunctionContext_t) context;
|
||||
ufc->resumeParameters[index] = new_value;
|
||||
@ -378,7 +378,7 @@ _LIBUNWIND_EXPORT void _Unwind_SetGR(struct _Unwind_Context *context, int index,
|
||||
/// Called by personality handler during phase 2 to get instruction pointer.
|
||||
_LIBUNWIND_EXPORT uintptr_t _Unwind_GetIP(struct _Unwind_Context *context) {
|
||||
_Unwind_FunctionContext_t ufc = (_Unwind_FunctionContext_t) context;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetIP(context=%p) => 0x%lX\n", context,
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetIP(context=%p) => 0x%lX", context,
|
||||
ufc->resumeLocation + 1);
|
||||
return ufc->resumeLocation + 1;
|
||||
}
|
||||
@ -391,7 +391,7 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetIPInfo(struct _Unwind_Context *context,
|
||||
int *ipBefore) {
|
||||
_Unwind_FunctionContext_t ufc = (_Unwind_FunctionContext_t) context;
|
||||
*ipBefore = 0;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetIPInfo(context=%p, %p) => 0x%lX\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetIPInfo(context=%p, %p) => 0x%lX",
|
||||
context, ipBefore, ufc->resumeLocation + 1);
|
||||
return ufc->resumeLocation + 1;
|
||||
}
|
||||
@ -400,7 +400,7 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetIPInfo(struct _Unwind_Context *context,
|
||||
/// Called by personality handler during phase 2 to alter instruction pointer.
|
||||
_LIBUNWIND_EXPORT void _Unwind_SetIP(struct _Unwind_Context *context,
|
||||
uintptr_t new_value) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SetIP(context=%p, value=0x%0lX)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SetIP(context=%p, value=0x%0lX)",
|
||||
context, new_value);
|
||||
_Unwind_FunctionContext_t ufc = (_Unwind_FunctionContext_t) context;
|
||||
ufc->resumeLocation = new_value - 1;
|
||||
@ -413,7 +413,7 @@ _LIBUNWIND_EXPORT uintptr_t
|
||||
_Unwind_GetRegionStart(struct _Unwind_Context *context) {
|
||||
// Not supported or needed for sjlj based unwinding
|
||||
(void)context;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p)\n", context);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p)", context);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -422,7 +422,7 @@ _Unwind_GetRegionStart(struct _Unwind_Context *context) {
|
||||
/// is caught.
|
||||
_LIBUNWIND_EXPORT void
|
||||
_Unwind_DeleteException(struct _Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)",
|
||||
exception_object);
|
||||
if (exception_object->exception_cleanup != NULL)
|
||||
(*exception_object->exception_cleanup)(_URC_FOREIGN_EXCEPTION_CAUGHT,
|
||||
@ -437,7 +437,7 @@ _LIBUNWIND_EXPORT uintptr_t
|
||||
_Unwind_GetDataRelBase(struct _Unwind_Context *context) {
|
||||
// Not supported or needed for sjlj based unwinding
|
||||
(void)context;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetDataRelBase(context=%p)\n", context);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetDataRelBase(context=%p)", context);
|
||||
_LIBUNWIND_ABORT("_Unwind_GetDataRelBase() not implemented");
|
||||
}
|
||||
|
||||
@ -448,14 +448,14 @@ _LIBUNWIND_EXPORT uintptr_t
|
||||
_Unwind_GetTextRelBase(struct _Unwind_Context *context) {
|
||||
// Not supported or needed for sjlj based unwinding
|
||||
(void)context;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetTextRelBase(context=%p)\n", context);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetTextRelBase(context=%p)", context);
|
||||
_LIBUNWIND_ABORT("_Unwind_GetTextRelBase() not implemented");
|
||||
}
|
||||
|
||||
|
||||
/// Called by personality handler to get "Call Frame Area" for current frame.
|
||||
_LIBUNWIND_EXPORT uintptr_t _Unwind_GetCFA(struct _Unwind_Context *context) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetCFA(context=%p)\n", context);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetCFA(context=%p)", context);
|
||||
if (context != NULL) {
|
||||
_Unwind_FunctionContext_t ufc = (_Unwind_FunctionContext_t) context;
|
||||
// Setjmp/longjmp based exceptions don't have a true CFA.
|
||||
|
@ -6,7 +6,7 @@
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//
|
||||
// C++ interface to lower levels of libuwind
|
||||
// C++ interface to lower levels of libunwind
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef __UNWINDCURSOR_HPP__
|
||||
@ -935,7 +935,7 @@ bool UnwindCursor<A, R>::getInfoFromDwarfSection(pint_t pc,
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//_LIBUNWIND_DEBUG_LOG("can't find/use FDE for pc=0x%llX\n", (uint64_t)pc);
|
||||
//_LIBUNWIND_DEBUG_LOG("can't find/use FDE for pc=0x%llX", (uint64_t)pc);
|
||||
return false;
|
||||
}
|
||||
#endif // _LIBUNWIND_SUPPORT_DWARF_UNWIND
|
||||
@ -1092,13 +1092,13 @@ bool UnwindCursor<A, R>::getInfoFromCompactEncodingSection(pint_t pc,
|
||||
funcEnd = firstLevelNextPageFunctionOffset + sects.dso_base;
|
||||
if (pc < funcStart) {
|
||||
_LIBUNWIND_DEBUG_LOG("malformed __unwind_info, pc=0x%llX not in second "
|
||||
"level compressed unwind table. funcStart=0x%llX\n",
|
||||
"level compressed unwind table. funcStart=0x%llX",
|
||||
(uint64_t) pc, (uint64_t) funcStart);
|
||||
return false;
|
||||
}
|
||||
if (pc > funcEnd) {
|
||||
_LIBUNWIND_DEBUG_LOG("malformed __unwind_info, pc=0x%llX not in second "
|
||||
"level compressed unwind table. funcEnd=0x%llX\n",
|
||||
"level compressed unwind table. funcEnd=0x%llX",
|
||||
(uint64_t) pc, (uint64_t) funcEnd);
|
||||
return false;
|
||||
}
|
||||
@ -1119,7 +1119,7 @@ bool UnwindCursor<A, R>::getInfoFromCompactEncodingSection(pint_t pc,
|
||||
}
|
||||
} else {
|
||||
_LIBUNWIND_DEBUG_LOG("malformed __unwind_info at 0x%0llX bad second "
|
||||
"level page\n",
|
||||
"level page",
|
||||
(uint64_t) sects.compact_unwind_section);
|
||||
return false;
|
||||
}
|
||||
@ -1149,7 +1149,7 @@ bool UnwindCursor<A, R>::getInfoFromCompactEncodingSection(pint_t pc,
|
||||
}
|
||||
if (lsda == 0) {
|
||||
_LIBUNWIND_DEBUG_LOG("found encoding 0x%08X with HAS_LSDA bit set for "
|
||||
"pc=0x%0llX, but lsda table has no entry\n",
|
||||
"pc=0x%0llX, but lsda table has no entry",
|
||||
encoding, (uint64_t) pc);
|
||||
return false;
|
||||
}
|
||||
@ -1162,7 +1162,7 @@ bool UnwindCursor<A, R>::getInfoFromCompactEncodingSection(pint_t pc,
|
||||
--personalityIndex; // change 1-based to zero-based index
|
||||
if (personalityIndex > sectionHeader.personalityArrayCount()) {
|
||||
_LIBUNWIND_DEBUG_LOG("found encoding 0x%08X with personality index %d, "
|
||||
"but personality table has only %d entires\n",
|
||||
"but personality table has only %d entires",
|
||||
encoding, personalityIndex,
|
||||
sectionHeader.personalityArrayCount());
|
||||
return false;
|
||||
|
@ -29,11 +29,11 @@
|
||||
_LIBUNWIND_EXPORT _Unwind_Reason_Code
|
||||
_Unwind_Resume_or_Rethrow(_Unwind_Exception *exception_object) {
|
||||
#if _LIBUNWIND_ARM_EHABI
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Resume_or_Rethrow(ex_obj=%p), private_1=%ld\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Resume_or_Rethrow(ex_obj=%p), private_1=%ld",
|
||||
(void *)exception_object,
|
||||
(long)exception_object->unwinder_cache.reserved1);
|
||||
#else
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Resume_or_Rethrow(ex_obj=%p), private_1=%ld\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Resume_or_Rethrow(ex_obj=%p), private_1=%ld",
|
||||
(void *)exception_object,
|
||||
(long)exception_object->private_1);
|
||||
#endif
|
||||
@ -66,7 +66,7 @@ _Unwind_Resume_or_Rethrow(_Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_EXPORT uintptr_t
|
||||
_Unwind_GetDataRelBase(struct _Unwind_Context *context) {
|
||||
(void)context;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetDataRelBase(context=%p)\n", (void *)context);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetDataRelBase(context=%p)", (void *)context);
|
||||
_LIBUNWIND_ABORT("_Unwind_GetDataRelBase() not implemented");
|
||||
}
|
||||
|
||||
@ -76,7 +76,7 @@ _Unwind_GetDataRelBase(struct _Unwind_Context *context) {
|
||||
_LIBUNWIND_EXPORT uintptr_t
|
||||
_Unwind_GetTextRelBase(struct _Unwind_Context *context) {
|
||||
(void)context;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetTextRelBase(context=%p)\n", (void *)context);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetTextRelBase(context=%p)", (void *)context);
|
||||
_LIBUNWIND_ABORT("_Unwind_GetTextRelBase() not implemented");
|
||||
}
|
||||
|
||||
@ -84,7 +84,7 @@ _Unwind_GetTextRelBase(struct _Unwind_Context *context) {
|
||||
/// Scans unwind information to find the function that contains the
|
||||
/// specified code address "pc".
|
||||
_LIBUNWIND_EXPORT void *_Unwind_FindEnclosingFunction(void *pc) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_FindEnclosingFunction(pc=%p)\n", pc);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_FindEnclosingFunction(pc=%p)", pc);
|
||||
// This is slow, but works.
|
||||
// We create an unwind cursor then alter the IP to be pc
|
||||
unw_cursor_t cursor;
|
||||
@ -108,7 +108,7 @@ _Unwind_Backtrace(_Unwind_Trace_Fn callback, void *ref) {
|
||||
unw_getcontext(&uc);
|
||||
unw_init_local(&cursor, &uc);
|
||||
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Backtrace(callback=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Backtrace(callback=%p)",
|
||||
(void *)(uintptr_t)callback);
|
||||
|
||||
#if _LIBUNWIND_ARM_EHABI
|
||||
@ -123,11 +123,11 @@ _Unwind_Backtrace(_Unwind_Trace_Fn callback, void *ref) {
|
||||
_Unwind_Reason_Code result;
|
||||
|
||||
#if !_LIBUNWIND_ARM_EHABI
|
||||
// ask libuwind to get next frame (skip over first frame which is
|
||||
// ask libunwind to get next frame (skip over first frame which is
|
||||
// _Unwind_Backtrace())
|
||||
if (unw_step(&cursor) <= 0) {
|
||||
_LIBUNWIND_TRACE_UNWINDING(" _backtrace: ended because cursor reached "
|
||||
"bottom of stack, returning %d\n",
|
||||
"bottom of stack, returning %d",
|
||||
_URC_END_OF_STACK);
|
||||
return _URC_END_OF_STACK;
|
||||
}
|
||||
@ -164,7 +164,7 @@ _Unwind_Backtrace(_Unwind_Trace_Fn callback, void *ref) {
|
||||
unw_get_proc_name(&cursor, functionName, 512, &offset);
|
||||
unw_get_proc_info(&cursor, &frame);
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
" _backtrace: start_ip=0x%llX, func=%s, lsda=0x%llX, context=%p\n",
|
||||
" _backtrace: start_ip=0x%llX, func=%s, lsda=0x%llX, context=%p",
|
||||
(long long)frame.start_ip, functionName, (long long)frame.lsda,
|
||||
(void *)&cursor);
|
||||
}
|
||||
@ -173,7 +173,7 @@ _Unwind_Backtrace(_Unwind_Trace_Fn callback, void *ref) {
|
||||
result = (*callback)((struct _Unwind_Context *)(&cursor), ref);
|
||||
if (result != _URC_NO_REASON) {
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
" _backtrace: ended because callback returned %d\n", result);
|
||||
" _backtrace: ended because callback returned %d", result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -195,7 +195,7 @@ _LIBUNWIND_EXPORT const void *_Unwind_Find_FDE(const void *pc,
|
||||
bases->tbase = (uintptr_t)info.extra;
|
||||
bases->dbase = 0; // dbase not used on Mac OS X
|
||||
bases->func = (uintptr_t)info.start_ip;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Find_FDE(pc=%p) => %p\n", pc,
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Find_FDE(pc=%p) => %p", pc,
|
||||
(void *)(long) info.unwind_info);
|
||||
return (void *)(long) info.unwind_info;
|
||||
}
|
||||
@ -206,7 +206,7 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetCFA(struct _Unwind_Context *context) {
|
||||
unw_cursor_t *cursor = (unw_cursor_t *)context;
|
||||
unw_word_t result;
|
||||
unw_get_reg(cursor, UNW_REG_SP, &result);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetCFA(context=%p) => 0x%" PRIx64 "\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetCFA(context=%p) => 0x%" PRIx64,
|
||||
(void *)context, (uint64_t)result);
|
||||
return (uintptr_t)result;
|
||||
}
|
||||
@ -217,7 +217,7 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetCFA(struct _Unwind_Context *context) {
|
||||
/// site address. Normally IP is the return address.
|
||||
_LIBUNWIND_EXPORT uintptr_t _Unwind_GetIPInfo(struct _Unwind_Context *context,
|
||||
int *ipBefore) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetIPInfo(context=%p)\n", (void *)context);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetIPInfo(context=%p)", (void *)context);
|
||||
*ipBefore = 0;
|
||||
return _Unwind_GetIP(context);
|
||||
}
|
||||
@ -229,7 +229,7 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetIPInfo(struct _Unwind_Context *context,
|
||||
/// This function has existed on Mac OS X since 10.4, but
|
||||
/// was broken until 10.6.
|
||||
_LIBUNWIND_EXPORT void __register_frame(const void *fde) {
|
||||
_LIBUNWIND_TRACE_API("__register_frame(%p)\n", fde);
|
||||
_LIBUNWIND_TRACE_API("__register_frame(%p)", fde);
|
||||
_unw_add_dynamic_fde((unw_word_t)(uintptr_t) fde);
|
||||
}
|
||||
|
||||
@ -239,7 +239,7 @@ _LIBUNWIND_EXPORT void __register_frame(const void *fde) {
|
||||
/// This function has existed on Mac OS X since 10.4, but
|
||||
/// was broken until 10.6.
|
||||
_LIBUNWIND_EXPORT void __deregister_frame(const void *fde) {
|
||||
_LIBUNWIND_TRACE_API("__deregister_frame(%p)\n", fde);
|
||||
_LIBUNWIND_TRACE_API("__deregister_frame(%p)", fde);
|
||||
_unw_remove_dynamic_fde((unw_word_t)(uintptr_t) fde);
|
||||
}
|
||||
|
||||
@ -259,7 +259,7 @@ _LIBUNWIND_EXPORT void __register_frame_info_bases(const void *fde, void *ob,
|
||||
(void)ob;
|
||||
(void)tb;
|
||||
(void)db;
|
||||
_LIBUNWIND_TRACE_API("__register_frame_info_bases(%p,%p, %p, %p)\n",
|
||||
_LIBUNWIND_TRACE_API("__register_frame_info_bases(%p,%p, %p, %p)",
|
||||
fde, ob, tb, db);
|
||||
// do nothing, this function never worked in Mac OS X
|
||||
}
|
||||
@ -267,7 +267,7 @@ _LIBUNWIND_EXPORT void __register_frame_info_bases(const void *fde, void *ob,
|
||||
_LIBUNWIND_EXPORT void __register_frame_info(const void *fde, void *ob) {
|
||||
(void)fde;
|
||||
(void)ob;
|
||||
_LIBUNWIND_TRACE_API("__register_frame_info(%p, %p)\n", fde, ob);
|
||||
_LIBUNWIND_TRACE_API("__register_frame_info(%p, %p)", fde, ob);
|
||||
// do nothing, this function never worked in Mac OS X
|
||||
}
|
||||
|
||||
@ -279,33 +279,33 @@ _LIBUNWIND_EXPORT void __register_frame_info_table_bases(const void *fde,
|
||||
(void)tb;
|
||||
(void)db;
|
||||
_LIBUNWIND_TRACE_API("__register_frame_info_table_bases"
|
||||
"(%p,%p, %p, %p)\n", fde, ob, tb, db);
|
||||
"(%p,%p, %p, %p)", fde, ob, tb, db);
|
||||
// do nothing, this function never worked in Mac OS X
|
||||
}
|
||||
|
||||
_LIBUNWIND_EXPORT void __register_frame_info_table(const void *fde, void *ob) {
|
||||
(void)fde;
|
||||
(void)ob;
|
||||
_LIBUNWIND_TRACE_API("__register_frame_info_table(%p, %p)\n", fde, ob);
|
||||
_LIBUNWIND_TRACE_API("__register_frame_info_table(%p, %p)", fde, ob);
|
||||
// do nothing, this function never worked in Mac OS X
|
||||
}
|
||||
|
||||
_LIBUNWIND_EXPORT void __register_frame_table(const void *fde) {
|
||||
(void)fde;
|
||||
_LIBUNWIND_TRACE_API("__register_frame_table(%p)\n", fde);
|
||||
_LIBUNWIND_TRACE_API("__register_frame_table(%p)", fde);
|
||||
// do nothing, this function never worked in Mac OS X
|
||||
}
|
||||
|
||||
_LIBUNWIND_EXPORT void *__deregister_frame_info(const void *fde) {
|
||||
(void)fde;
|
||||
_LIBUNWIND_TRACE_API("__deregister_frame_info(%p)\n", fde);
|
||||
_LIBUNWIND_TRACE_API("__deregister_frame_info(%p)", fde);
|
||||
// do nothing, this function never worked in Mac OS X
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_LIBUNWIND_EXPORT void *__deregister_frame_info_bases(const void *fde) {
|
||||
(void)fde;
|
||||
_LIBUNWIND_TRACE_API("__deregister_frame_info_bases(%p)\n", fde);
|
||||
_LIBUNWIND_TRACE_API("__deregister_frame_info_bases(%p)", fde);
|
||||
// do nothing, this function never worked in Mac OS X
|
||||
return NULL;
|
||||
}
|
||||
|
@ -39,17 +39,17 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
// Walk each frame looking for a place to stop.
|
||||
bool handlerNotFound = true;
|
||||
while (handlerNotFound) {
|
||||
// Ask libuwind to get next frame (skip over first which is
|
||||
// Ask libunwind to get next frame (skip over first which is
|
||||
// _Unwind_RaiseException).
|
||||
int stepResult = unw_step(cursor);
|
||||
if (stepResult == 0) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): unw_step() reached "
|
||||
"bottom => _URC_END_OF_STACK\n",
|
||||
"bottom => _URC_END_OF_STACK",
|
||||
(void *)exception_object);
|
||||
return _URC_END_OF_STACK;
|
||||
} else if (stepResult < 0) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): unw_step failed => "
|
||||
"_URC_FATAL_PHASE1_ERROR\n",
|
||||
"_URC_FATAL_PHASE1_ERROR",
|
||||
(void *)exception_object);
|
||||
return _URC_FATAL_PHASE1_ERROR;
|
||||
}
|
||||
@ -59,7 +59,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
unw_word_t sp;
|
||||
if (unw_get_proc_info(cursor, &frameInfo) != UNW_ESUCCESS) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): unw_get_proc_info "
|
||||
"failed => _URC_FATAL_PHASE1_ERROR\n",
|
||||
"failed => _URC_FATAL_PHASE1_ERROR",
|
||||
(void *)exception_object);
|
||||
return _URC_FATAL_PHASE1_ERROR;
|
||||
}
|
||||
@ -77,7 +77,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
unw_get_reg(cursor, UNW_REG_IP, &pc);
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): pc=0x%" PRIx64 ", start_ip=0x%" PRIx64
|
||||
", func=%s, lsda=0x%" PRIx64 ", personality=0x%" PRIx64 "\n",
|
||||
", func=%s, lsda=0x%" PRIx64 ", personality=0x%" PRIx64 "",
|
||||
(void *)exception_object, pc, frameInfo.start_ip, functionName,
|
||||
frameInfo.lsda, frameInfo.handler);
|
||||
}
|
||||
@ -88,7 +88,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
__personality_routine p =
|
||||
(__personality_routine)(long)(frameInfo.handler);
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): calling personality function %p\n",
|
||||
"unwind_phase1(ex_ojb=%p): calling personality function %p",
|
||||
(void *)exception_object, (void *)(uintptr_t)p);
|
||||
_Unwind_Reason_Code personalityResult =
|
||||
(*p)(1, _UA_SEARCH_PHASE, exception_object->exception_class,
|
||||
@ -101,13 +101,13 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
unw_get_reg(cursor, UNW_REG_SP, &sp);
|
||||
exception_object->private_2 = (uintptr_t)sp;
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): _URC_HANDLER_FOUND \n",
|
||||
"unwind_phase1(ex_ojb=%p): _URC_HANDLER_FOUND",
|
||||
(void *)exception_object);
|
||||
return _URC_NO_REASON;
|
||||
|
||||
case _URC_CONTINUE_UNWIND:
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): _URC_CONTINUE_UNWIND\n",
|
||||
"unwind_phase1(ex_ojb=%p): _URC_CONTINUE_UNWIND",
|
||||
(void *)exception_object);
|
||||
// continue unwinding
|
||||
break;
|
||||
@ -115,7 +115,7 @@ unwind_phase1(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
default:
|
||||
// something went wrong
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase1(ex_ojb=%p): _URC_FATAL_PHASE1_ERROR\n",
|
||||
"unwind_phase1(ex_ojb=%p): _URC_FATAL_PHASE1_ERROR",
|
||||
(void *)exception_object);
|
||||
return _URC_FATAL_PHASE1_ERROR;
|
||||
}
|
||||
@ -129,23 +129,23 @@ static _Unwind_Reason_Code
|
||||
unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *exception_object) {
|
||||
unw_init_local(cursor, uc);
|
||||
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p)\n",
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p)",
|
||||
(void *)exception_object);
|
||||
|
||||
// Walk each frame until we reach where search phase said to stop.
|
||||
while (true) {
|
||||
|
||||
// Ask libuwind to get next frame (skip over first which is
|
||||
// Ask libunwind to get next frame (skip over first which is
|
||||
// _Unwind_RaiseException).
|
||||
int stepResult = unw_step(cursor);
|
||||
if (stepResult == 0) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): unw_step() reached "
|
||||
"bottom => _URC_END_OF_STACK\n",
|
||||
"bottom => _URC_END_OF_STACK",
|
||||
(void *)exception_object);
|
||||
return _URC_END_OF_STACK;
|
||||
} else if (stepResult < 0) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): unw_step failed => "
|
||||
"_URC_FATAL_PHASE1_ERROR\n",
|
||||
"_URC_FATAL_PHASE1_ERROR",
|
||||
(void *)exception_object);
|
||||
return _URC_FATAL_PHASE2_ERROR;
|
||||
}
|
||||
@ -156,7 +156,7 @@ unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
unw_get_reg(cursor, UNW_REG_SP, &sp);
|
||||
if (unw_get_proc_info(cursor, &frameInfo) != UNW_ESUCCESS) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): unw_get_proc_info "
|
||||
"failed => _URC_FATAL_PHASE1_ERROR\n",
|
||||
"failed => _URC_FATAL_PHASE1_ERROR",
|
||||
(void *)exception_object);
|
||||
return _URC_FATAL_PHASE2_ERROR;
|
||||
}
|
||||
@ -172,7 +172,7 @@ unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
functionName = ".anonymous.";
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): start_ip=0x%" PRIx64
|
||||
", func=%s, sp=0x%" PRIx64 ", lsda=0x%" PRIx64
|
||||
", personality=0x%" PRIx64 "\n",
|
||||
", personality=0x%" PRIx64,
|
||||
(void *)exception_object, frameInfo.start_ip,
|
||||
functionName, sp, frameInfo.lsda,
|
||||
frameInfo.handler);
|
||||
@ -194,7 +194,7 @@ unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
case _URC_CONTINUE_UNWIND:
|
||||
// Continue unwinding
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2(ex_ojb=%p): _URC_CONTINUE_UNWIND\n",
|
||||
"unwind_phase2(ex_ojb=%p): _URC_CONTINUE_UNWIND",
|
||||
(void *)exception_object);
|
||||
if (sp == exception_object->private_2) {
|
||||
// Phase 1 said we would stop at this frame, but we did not...
|
||||
@ -204,7 +204,7 @@ unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
break;
|
||||
case _URC_INSTALL_CONTEXT:
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2(ex_ojb=%p): _URC_INSTALL_CONTEXT\n",
|
||||
"unwind_phase2(ex_ojb=%p): _URC_INSTALL_CONTEXT",
|
||||
(void *)exception_object);
|
||||
// Personality routine says to transfer control to landing pad.
|
||||
// We may get control back if landing pad calls _Unwind_Resume().
|
||||
@ -214,7 +214,7 @@ unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *except
|
||||
unw_get_reg(cursor, UNW_REG_SP, &sp);
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): re-entering "
|
||||
"user code with ip=0x%" PRIx64
|
||||
", sp=0x%" PRIx64 "\n",
|
||||
", sp=0x%" PRIx64,
|
||||
(void *)exception_object, pc, sp);
|
||||
}
|
||||
unw_resume(cursor);
|
||||
@ -247,7 +247,7 @@ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
|
||||
unw_proc_info_t frameInfo;
|
||||
if (unw_get_proc_info(cursor, &frameInfo) != UNW_ESUCCESS) {
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): unw_step "
|
||||
"failed => _URC_END_OF_STACK\n",
|
||||
"failed => _URC_END_OF_STACK",
|
||||
(void *)exception_object);
|
||||
return _URC_FATAL_PHASE2_ERROR;
|
||||
}
|
||||
@ -263,7 +263,7 @@ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
|
||||
functionName = ".anonymous.";
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2_forced(ex_ojb=%p): start_ip=0x%" PRIx64
|
||||
", func=%s, lsda=0x%" PRIx64 ", personality=0x%" PRIx64 "\n",
|
||||
", func=%s, lsda=0x%" PRIx64 ", personality=0x%" PRIx64,
|
||||
(void *)exception_object, frameInfo.start_ip, functionName,
|
||||
frameInfo.lsda, frameInfo.handler);
|
||||
}
|
||||
@ -275,11 +275,11 @@ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
|
||||
(*stop)(1, action, exception_object->exception_class, exception_object,
|
||||
(struct _Unwind_Context *)(cursor), stop_parameter);
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2_forced(ex_ojb=%p): stop function returned %d\n",
|
||||
"unwind_phase2_forced(ex_ojb=%p): stop function returned %d",
|
||||
(void *)exception_object, stopResult);
|
||||
if (stopResult != _URC_NO_REASON) {
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2_forced(ex_ojb=%p): stopped by stop function\n",
|
||||
"unwind_phase2_forced(ex_ojb=%p): stopped by stop function",
|
||||
(void *)exception_object);
|
||||
return _URC_FATAL_PHASE2_ERROR;
|
||||
}
|
||||
@ -289,7 +289,7 @@ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
|
||||
__personality_routine p =
|
||||
(__personality_routine)(long)(frameInfo.handler);
|
||||
_LIBUNWIND_TRACE_UNWINDING(
|
||||
"unwind_phase2_forced(ex_ojb=%p): calling personality function %p\n",
|
||||
"unwind_phase2_forced(ex_ojb=%p): calling personality function %p",
|
||||
(void *)exception_object, (void *)(uintptr_t)p);
|
||||
_Unwind_Reason_Code personalityResult =
|
||||
(*p)(1, action, exception_object->exception_class, exception_object,
|
||||
@ -298,14 +298,14 @@ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
|
||||
case _URC_CONTINUE_UNWIND:
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"personality returned "
|
||||
"_URC_CONTINUE_UNWIND\n",
|
||||
"_URC_CONTINUE_UNWIND",
|
||||
(void *)exception_object);
|
||||
// Destructors called, continue unwinding
|
||||
break;
|
||||
case _URC_INSTALL_CONTEXT:
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"personality returned "
|
||||
"_URC_INSTALL_CONTEXT\n",
|
||||
"_URC_INSTALL_CONTEXT",
|
||||
(void *)exception_object);
|
||||
// We may get control back if landing pad calls _Unwind_Resume().
|
||||
unw_resume(cursor);
|
||||
@ -314,7 +314,7 @@ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
|
||||
// Personality routine returned an unknown result code.
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): "
|
||||
"personality returned %d, "
|
||||
"_URC_FATAL_PHASE2_ERROR\n",
|
||||
"_URC_FATAL_PHASE2_ERROR",
|
||||
(void *)exception_object, personalityResult);
|
||||
return _URC_FATAL_PHASE2_ERROR;
|
||||
}
|
||||
@ -324,7 +324,7 @@ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
|
||||
// Call stop function one last time and tell it we've reached the end
|
||||
// of the stack.
|
||||
_LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): calling stop "
|
||||
"function with _UA_END_OF_STACK\n",
|
||||
"function with _UA_END_OF_STACK",
|
||||
(void *)exception_object);
|
||||
_Unwind_Action lastAction =
|
||||
(_Unwind_Action)(_UA_FORCE_UNWIND | _UA_CLEANUP_PHASE | _UA_END_OF_STACK);
|
||||
@ -340,7 +340,7 @@ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
|
||||
/// Called by __cxa_throw. Only returns if there is a fatal error.
|
||||
_LIBUNWIND_EXPORT _Unwind_Reason_Code
|
||||
_Unwind_RaiseException(_Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_RaiseException(ex_obj=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_RaiseException(ex_obj=%p)",
|
||||
(void *)exception_object);
|
||||
unw_context_t uc;
|
||||
unw_cursor_t cursor;
|
||||
@ -375,7 +375,7 @@ _Unwind_RaiseException(_Unwind_Exception *exception_object) {
|
||||
/// in turn calls _Unwind_Resume_or_Rethrow().
|
||||
_LIBUNWIND_EXPORT void
|
||||
_Unwind_Resume(_Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Resume(ex_obj=%p)\n", (void *)exception_object);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_Resume(ex_obj=%p)", (void *)exception_object);
|
||||
unw_context_t uc;
|
||||
unw_cursor_t cursor;
|
||||
unw_getcontext(&uc);
|
||||
@ -399,7 +399,7 @@ _Unwind_Resume(_Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_EXPORT _Unwind_Reason_Code
|
||||
_Unwind_ForcedUnwind(_Unwind_Exception *exception_object,
|
||||
_Unwind_Stop_Fn stop, void *stop_parameter) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_ForcedUnwind(ex_obj=%p, stop=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_ForcedUnwind(ex_obj=%p, stop=%p)",
|
||||
(void *)exception_object, (void *)(uintptr_t)stop);
|
||||
unw_context_t uc;
|
||||
unw_cursor_t cursor;
|
||||
@ -424,11 +424,11 @@ _Unwind_GetLanguageSpecificData(struct _Unwind_Context *context) {
|
||||
if (unw_get_proc_info(cursor, &frameInfo) == UNW_ESUCCESS)
|
||||
result = (uintptr_t)frameInfo.lsda;
|
||||
_LIBUNWIND_TRACE_API(
|
||||
"_Unwind_GetLanguageSpecificData(context=%p) => 0x%" PRIxPTR "\n",
|
||||
"_Unwind_GetLanguageSpecificData(context=%p) => 0x%" PRIxPTR,
|
||||
(void *)context, result);
|
||||
if (result != 0) {
|
||||
if (*((uint8_t *)result) != 0xFF)
|
||||
_LIBUNWIND_DEBUG_LOG("lsda at 0x%" PRIxPTR " does not start with 0xFF\n",
|
||||
_LIBUNWIND_DEBUG_LOG("lsda at 0x%" PRIxPTR " does not start with 0xFF",
|
||||
result);
|
||||
}
|
||||
return result;
|
||||
@ -444,7 +444,7 @@ _Unwind_GetRegionStart(struct _Unwind_Context *context) {
|
||||
uintptr_t result = 0;
|
||||
if (unw_get_proc_info(cursor, &frameInfo) == UNW_ESUCCESS)
|
||||
result = (uintptr_t)frameInfo.start_ip;
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p) => 0x%" PRIxPTR "\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p) => 0x%" PRIxPTR,
|
||||
(void *)context, result);
|
||||
return result;
|
||||
}
|
||||
@ -454,7 +454,7 @@ _Unwind_GetRegionStart(struct _Unwind_Context *context) {
|
||||
// is caught.
|
||||
_LIBUNWIND_EXPORT void
|
||||
_Unwind_DeleteException(_Unwind_Exception *exception_object) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)",
|
||||
(void *)exception_object);
|
||||
if (exception_object->exception_cleanup != NULL)
|
||||
(*exception_object->exception_cleanup)(_URC_FOREIGN_EXCEPTION_CAUGHT,
|
||||
@ -467,7 +467,7 @@ _Unwind_GetGR(struct _Unwind_Context *context, int index) {
|
||||
unw_cursor_t *cursor = (unw_cursor_t *)context;
|
||||
unw_word_t result;
|
||||
unw_get_reg(cursor, index, &result);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetGR(context=%p, reg=%d) => 0x%" PRIx64 "\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetGR(context=%p, reg=%d) => 0x%" PRIx64,
|
||||
(void *)context, index, (uint64_t)result);
|
||||
return (uintptr_t)result;
|
||||
}
|
||||
@ -476,7 +476,7 @@ _Unwind_GetGR(struct _Unwind_Context *context, int index) {
|
||||
_LIBUNWIND_EXPORT void _Unwind_SetGR(struct _Unwind_Context *context, int index,
|
||||
uintptr_t value) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SetGR(context=%p, reg=%d, value=0x%0" PRIx64
|
||||
")\n",
|
||||
")",
|
||||
(void *)context, index, (uint64_t)value);
|
||||
unw_cursor_t *cursor = (unw_cursor_t *)context;
|
||||
unw_set_reg(cursor, index, value);
|
||||
@ -487,7 +487,7 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetIP(struct _Unwind_Context *context) {
|
||||
unw_cursor_t *cursor = (unw_cursor_t *)context;
|
||||
unw_word_t result;
|
||||
unw_get_reg(cursor, UNW_REG_IP, &result);
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetIP(context=%p) => 0x%" PRIx64 "\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_GetIP(context=%p) => 0x%" PRIx64,
|
||||
(void *)context, (uint64_t)result);
|
||||
return (uintptr_t)result;
|
||||
}
|
||||
@ -497,7 +497,7 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetIP(struct _Unwind_Context *context) {
|
||||
/// start executing in the landing pad.
|
||||
_LIBUNWIND_EXPORT void _Unwind_SetIP(struct _Unwind_Context *context,
|
||||
uintptr_t value) {
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SetIP(context=%p, value=0x%0" PRIx64 ")\n",
|
||||
_LIBUNWIND_TRACE_API("_Unwind_SetIP(context=%p, value=0x%0" PRIx64 ")",
|
||||
(void *)context, (uint64_t)value);
|
||||
unw_cursor_t *cursor = (unw_cursor_t *)context;
|
||||
unw_set_reg(cursor, UNW_REG_IP, value);
|
||||
|
@ -6,7 +6,7 @@
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//
|
||||
// Defines macros used within libuwind project.
|
||||
// Defines macros used within libunwind project.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
@ -84,7 +84,7 @@
|
||||
fflush(stderr); \
|
||||
abort(); \
|
||||
} while (0)
|
||||
#define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__)
|
||||
#define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libunwind: " msg "\n", __VA_ARGS__)
|
||||
|
||||
// Macros that define away in non-Debug builds
|
||||
#ifdef NDEBUG
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===--------------------------- libuwind.cpp -----------------------------===//
|
||||
//===--------------------------- libunwind.cpp ----------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -42,7 +42,7 @@ extern int unw_getcontext(unw_context_t *);
|
||||
/// unw_getcontext().
|
||||
_LIBUNWIND_EXPORT int unw_init_local(unw_cursor_t *cursor,
|
||||
unw_context_t *context) {
|
||||
_LIBUNWIND_TRACE_API("unw_init_local(cursor=%p, context=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_init_local(cursor=%p, context=%p)",
|
||||
static_cast<void *>(cursor),
|
||||
static_cast<void *>(context));
|
||||
#if defined(__i386__)
|
||||
@ -159,7 +159,7 @@ _LIBUNWIND_EXPORT void unw_destroy_addr_space(unw_addr_space_t asp) {
|
||||
/// Get value of specified register at cursor position in stack frame.
|
||||
_LIBUNWIND_EXPORT int unw_get_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||
unw_word_t *value) {
|
||||
_LIBUNWIND_TRACE_API("unw_get_reg(cursor=%p, regNum=%d, &value=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_get_reg(cursor=%p, regNum=%d, &value=%p)",
|
||||
static_cast<void *>(cursor), regNum,
|
||||
static_cast<void *>(value));
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
@ -174,7 +174,7 @@ _LIBUNWIND_EXPORT int unw_get_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||
/// Set value of specified register at cursor position in stack frame.
|
||||
_LIBUNWIND_EXPORT int unw_set_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||
unw_word_t value) {
|
||||
_LIBUNWIND_TRACE_API("unw_set_reg(cursor=%p, regNum=%d, value=0x%llX)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_set_reg(cursor=%p, regNum=%d, value=0x%llX)",
|
||||
static_cast<void *>(cursor), regNum, (long long)value);
|
||||
typedef LocalAddressSpace::pint_t pint_t;
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
@ -193,7 +193,7 @@ _LIBUNWIND_EXPORT int unw_set_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||
/// Get value of specified float register at cursor position in stack frame.
|
||||
_LIBUNWIND_EXPORT int unw_get_fpreg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||
unw_fpreg_t *value) {
|
||||
_LIBUNWIND_TRACE_API("unw_get_fpreg(cursor=%p, regNum=%d, &value=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_get_fpreg(cursor=%p, regNum=%d, &value=%p)",
|
||||
static_cast<void *>(cursor), regNum,
|
||||
static_cast<void *>(value));
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
@ -209,10 +209,10 @@ _LIBUNWIND_EXPORT int unw_get_fpreg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||
_LIBUNWIND_EXPORT int unw_set_fpreg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||
unw_fpreg_t value) {
|
||||
#if _LIBUNWIND_ARM_EHABI
|
||||
_LIBUNWIND_TRACE_API("unw_set_fpreg(cursor=%p, regNum=%d, value=%llX)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_set_fpreg(cursor=%p, regNum=%d, value=%llX)",
|
||||
static_cast<void *>(cursor), regNum, value);
|
||||
#else
|
||||
_LIBUNWIND_TRACE_API("unw_set_fpreg(cursor=%p, regNum=%d, value=%g)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_set_fpreg(cursor=%p, regNum=%d, value=%g)",
|
||||
static_cast<void *>(cursor), regNum, value);
|
||||
#endif
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
@ -226,7 +226,7 @@ _LIBUNWIND_EXPORT int unw_set_fpreg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||
|
||||
/// Move cursor to next frame.
|
||||
_LIBUNWIND_EXPORT int unw_step(unw_cursor_t *cursor) {
|
||||
_LIBUNWIND_TRACE_API("unw_step(cursor=%p)\n", static_cast<void *>(cursor));
|
||||
_LIBUNWIND_TRACE_API("unw_step(cursor=%p)", static_cast<void *>(cursor));
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
return co->step();
|
||||
}
|
||||
@ -235,7 +235,7 @@ _LIBUNWIND_EXPORT int unw_step(unw_cursor_t *cursor) {
|
||||
/// Get unwind info at cursor position in stack frame.
|
||||
_LIBUNWIND_EXPORT int unw_get_proc_info(unw_cursor_t *cursor,
|
||||
unw_proc_info_t *info) {
|
||||
_LIBUNWIND_TRACE_API("unw_get_proc_info(cursor=%p, &info=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_get_proc_info(cursor=%p, &info=%p)",
|
||||
static_cast<void *>(cursor), static_cast<void *>(info));
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
co->getInfo(info);
|
||||
@ -248,7 +248,7 @@ _LIBUNWIND_EXPORT int unw_get_proc_info(unw_cursor_t *cursor,
|
||||
|
||||
/// Resume execution at cursor position (aka longjump).
|
||||
_LIBUNWIND_EXPORT int unw_resume(unw_cursor_t *cursor) {
|
||||
_LIBUNWIND_TRACE_API("unw_resume(cursor=%p)\n", static_cast<void *>(cursor));
|
||||
_LIBUNWIND_TRACE_API("unw_resume(cursor=%p)", static_cast<void *>(cursor));
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
co->jumpto();
|
||||
return UNW_EUNSPEC;
|
||||
@ -258,7 +258,7 @@ _LIBUNWIND_EXPORT int unw_resume(unw_cursor_t *cursor) {
|
||||
/// Get name of function at cursor position in stack frame.
|
||||
_LIBUNWIND_EXPORT int unw_get_proc_name(unw_cursor_t *cursor, char *buf,
|
||||
size_t bufLen, unw_word_t *offset) {
|
||||
_LIBUNWIND_TRACE_API("unw_get_proc_name(cursor=%p, &buf=%p, bufLen=%lu)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_get_proc_name(cursor=%p, &buf=%p, bufLen=%lu)",
|
||||
static_cast<void *>(cursor), static_cast<void *>(buf),
|
||||
static_cast<unsigned long>(bufLen));
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
@ -271,7 +271,7 @@ _LIBUNWIND_EXPORT int unw_get_proc_name(unw_cursor_t *cursor, char *buf,
|
||||
|
||||
/// Checks if a register is a floating-point register.
|
||||
_LIBUNWIND_EXPORT int unw_is_fpreg(unw_cursor_t *cursor, unw_regnum_t regNum) {
|
||||
_LIBUNWIND_TRACE_API("unw_is_fpreg(cursor=%p, regNum=%d)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_is_fpreg(cursor=%p, regNum=%d)",
|
||||
static_cast<void *>(cursor), regNum);
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
return co->validFloatReg(regNum);
|
||||
@ -281,7 +281,7 @@ _LIBUNWIND_EXPORT int unw_is_fpreg(unw_cursor_t *cursor, unw_regnum_t regNum) {
|
||||
/// Checks if a register is a floating-point register.
|
||||
_LIBUNWIND_EXPORT const char *unw_regname(unw_cursor_t *cursor,
|
||||
unw_regnum_t regNum) {
|
||||
_LIBUNWIND_TRACE_API("unw_regname(cursor=%p, regNum=%d)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_regname(cursor=%p, regNum=%d)",
|
||||
static_cast<void *>(cursor), regNum);
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
return co->getRegisterName(regNum);
|
||||
@ -290,7 +290,7 @@ _LIBUNWIND_EXPORT const char *unw_regname(unw_cursor_t *cursor,
|
||||
|
||||
/// Checks if current frame is signal trampoline.
|
||||
_LIBUNWIND_EXPORT int unw_is_signal_frame(unw_cursor_t *cursor) {
|
||||
_LIBUNWIND_TRACE_API("unw_is_signal_frame(cursor=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_is_signal_frame(cursor=%p)",
|
||||
static_cast<void *>(cursor));
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
return co->isSignalFrame();
|
||||
@ -299,7 +299,7 @@ _LIBUNWIND_EXPORT int unw_is_signal_frame(unw_cursor_t *cursor) {
|
||||
#ifdef __arm__
|
||||
// Save VFP registers d0-d15 using FSTMIADX instead of FSTMIADD
|
||||
_LIBUNWIND_EXPORT void unw_save_vfp_as_X(unw_cursor_t *cursor) {
|
||||
_LIBUNWIND_TRACE_API("unw_fpreg_save_vfp_as_X(cursor=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_fpreg_save_vfp_as_X(cursor=%p)",
|
||||
static_cast<void *>(cursor));
|
||||
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
|
||||
return co->saveVFPAsX();
|
||||
@ -311,7 +311,7 @@ _LIBUNWIND_EXPORT void unw_save_vfp_as_X(unw_cursor_t *cursor) {
|
||||
/// SPI: walks cached dwarf entries
|
||||
_LIBUNWIND_EXPORT void unw_iterate_dwarf_unwind_cache(void (*func)(
|
||||
unw_word_t ip_start, unw_word_t ip_end, unw_word_t fde, unw_word_t mh)) {
|
||||
_LIBUNWIND_TRACE_API("unw_iterate_dwarf_unwind_cache(func=%p)\n",
|
||||
_LIBUNWIND_TRACE_API("unw_iterate_dwarf_unwind_cache(func=%p)",
|
||||
reinterpret_cast<void *>(func));
|
||||
DwarfFDECache<LocalAddressSpace>::iterateCacheEntries(func);
|
||||
}
|
||||
|
@ -120,12 +120,6 @@ ATF_TC_BODY(snprintf_posarg_error, tc)
|
||||
{
|
||||
char s[16], fmt[32];
|
||||
|
||||
#ifndef __NetBSD__
|
||||
atf_tc_expect_signal(SIGSEGV,
|
||||
"some non-NetBSD platforms including FreeBSD don't validate "
|
||||
"negative size; testcase blows up with SIGSEGV");
|
||||
#endif
|
||||
|
||||
snprintf(fmt, sizeof(fmt), "%%%zu$d", SIZE_MAX / sizeof(size_t));
|
||||
|
||||
ATF_CHECK(snprintf(s, sizeof(s), fmt, -23) == -1);
|
||||
|
@ -2544,11 +2544,6 @@ Zone Asia/Karachi 4:28:12 - LMT 1907
|
||||
# From Paul Eggert (2015-03-03):
|
||||
# http://www.timeanddate.com/time/change/west-bank/ramallah?year=2014
|
||||
# says that the fall 2014 transition was Oct 23 at 24:00.
|
||||
# For future dates, guess the last Friday in March at 24:00 through
|
||||
# the first Friday on or after October 21 at 00:00. This is consistent with
|
||||
# the predictions in today's editions of the following URLs:
|
||||
# http://www.timeanddate.com/time/change/gaza-strip/gaza
|
||||
# http://www.timeanddate.com/time/change/west-bank/hebron
|
||||
|
||||
# From Hannah Kreitem (2016-03-09):
|
||||
# http://www.palestinecabinet.gov.ps/WebSite/ar/ViewDetails?ID=31728
|
||||
@ -2558,7 +2553,21 @@ Zone Asia/Karachi 4:28:12 - LMT 1907
|
||||
#
|
||||
# From Paul Eggert (2016-03-12):
|
||||
# Predict spring transitions on March's last Saturday at 01:00 from now on.
|
||||
# Leave fall predictions alone for now.
|
||||
|
||||
# From Sharef Mustafa (2016-10-19):
|
||||
# [T]he Palestinian cabinet decision (Mar 8th 2016) published on
|
||||
# http://www.palestinecabinet.gov.ps/WebSite/Upload/Decree/GOV_17/16032016134830.pdf
|
||||
# states that summer time will end on Oct 29th at 01:00.
|
||||
#
|
||||
# From Tim Parenti (2016-10-19):
|
||||
# Predict fall transitions on October's last Saturday at 01:00 from now on.
|
||||
# This is consistent with the 2016 transition as well as our spring
|
||||
# predictions.
|
||||
#
|
||||
# From Paul Eggert (2016-10-19):
|
||||
# It's also consistent with predictions in the following URLs today:
|
||||
# http://www.timeanddate.com/time/change/gaza-strip/gaza
|
||||
# http://www.timeanddate.com/time/change/west-bank/hebron
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule EgyptAsia 1957 only - May 10 0:00 1:00 S
|
||||
@ -2587,9 +2596,10 @@ Rule Palestine 2011 only - Sep 30 0:00 0 -
|
||||
Rule Palestine 2012 2014 - Mar lastThu 24:00 1:00 S
|
||||
Rule Palestine 2012 only - Sep 21 1:00 0 -
|
||||
Rule Palestine 2013 only - Sep Fri>=21 0:00 0 -
|
||||
Rule Palestine 2014 max - Oct Fri>=21 0:00 0 -
|
||||
Rule Palestine 2014 2015 - Oct Fri>=21 0:00 0 -
|
||||
Rule Palestine 2015 only - Mar lastFri 24:00 1:00 S
|
||||
Rule Palestine 2016 max - Mar lastSat 1:00 1:00 S
|
||||
Rule Palestine 2016 max - Oct lastSat 1:00 0 -
|
||||
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Gaza 2:17:52 - LMT 1900 Oct
|
||||
@ -2739,45 +2749,31 @@ Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
|
||||
# People who live in regions under Tamil control can use [TZ='Asia/Kolkata'],
|
||||
# as that zone has agreed with the Tamil areas since our cutoff date of 1970.
|
||||
|
||||
# From K Sethu (2006-04-25):
|
||||
# I think the abbreviation LKT originated from the world of computers at
|
||||
# the time of or subsequent to the time zone changes by SL Government
|
||||
# twice in 1996 and probably SL Government or its standardization
|
||||
# agencies never declared an abbreviation as a national standard.
|
||||
# From Sadika Sumanapala (2016-10-19):
|
||||
# According to http://www.sltime.org (maintained by Measurement Units,
|
||||
# Standards & Services Department, Sri Lanka) abbreviation for Sri Lanka
|
||||
# standard time is SLST.
|
||||
#
|
||||
# I recollect before the recent change the government announcements
|
||||
# mentioning it as simply changing Sri Lanka Standard Time or Sri Lanka
|
||||
# Time and no mention was made about the abbreviation.
|
||||
#
|
||||
# If we look at Sri Lanka Department of Government's "Official News
|
||||
# Website of Sri Lanka" ... http://www.news.lk/ we can see that they
|
||||
# use SLT as abbreviation in time stamp at the beginning of each news
|
||||
# item....
|
||||
#
|
||||
# Within Sri Lanka I think LKT is well known among computer users and
|
||||
# administrators. In my opinion SLT may not be a good choice because the
|
||||
# nation's largest telcom / internet operator Sri Lanka Telcom is well
|
||||
# known by that abbreviation - simply as SLT (there IP domains are
|
||||
# slt.lk and sltnet.lk).
|
||||
#
|
||||
# But if indeed our government has adopted SLT as standard abbreviation
|
||||
# (that we have not known so far) then it is better that it be used for
|
||||
# all computers.
|
||||
|
||||
# From Paul Eggert (2006-04-25):
|
||||
# One possibility is that we wait for a bit for the dust to settle down
|
||||
# and then see what people actually say in practice.
|
||||
# From Paul Eggert (2016-10-18):
|
||||
# "SLST" seems to be reasonably recent and rarely-used outside time
|
||||
# zone nerd sources. I searched Google News and found three uses of
|
||||
# it in the International Business Times of India in February and
|
||||
# March of this year when discussing cricket match times, but nothing
|
||||
# since then (though there has been a lot of cricket) and nothing in
|
||||
# other English-language news sources. Our old abbreviation "LKT" is
|
||||
# even worse. For now, let's use a numeric abbreviation; we can
|
||||
# switch to "SLST" if it catches on.
|
||||
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Colombo 5:19:24 - LMT 1880
|
||||
5:19:32 - MMT 1906 # Moratuwa Mean Time
|
||||
5:30 - IST 1942 Jan 5
|
||||
5:30 0:30 IHST 1942 Sep
|
||||
5:30 1:00 IST 1945 Oct 16 2:00
|
||||
5:30 - IST 1996 May 25 0:00
|
||||
6:30 - LKT 1996 Oct 26 0:30
|
||||
6:00 - LKT 2006 Apr 15 0:30
|
||||
5:30 - IST
|
||||
5:30 - +0530 1942 Jan 5
|
||||
5:30 0:30 +0530/+06 1942 Sep
|
||||
5:30 1:00 +0530/+0630 1945 Oct 16 2:00
|
||||
5:30 - +0530 1996 May 25 0:00
|
||||
6:30 - +0630 1996 Oct 26 0:30
|
||||
6:00 - +06 2006 Apr 15 0:30
|
||||
5:30 - +0530
|
||||
|
||||
# Syria
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
|
@ -350,7 +350,13 @@ Zone Indian/Cocos 6:27:40 - LMT 1900
|
||||
# commencing at 2.00 am on Sunday 1st November, 2015 and ending at
|
||||
# 3.00 am on Sunday 17th January, 2016.
|
||||
|
||||
# From Paul Eggert (2015-09-01):
|
||||
# From Raymond Kumar (2016-10-04):
|
||||
# http://www.fiji.gov.fj/Media-Center/Press-Releases/DAYLIGHT-SAVING-STARTS-ON-6th-NOVEMBER,-2016.aspx
|
||||
# "Fiji's daylight savings will begin on Sunday, 6 November 2016, when
|
||||
# clocks go forward an hour at 2am to 3am.... Daylight Saving will
|
||||
# end at 3.00am on Sunday 15th January 2017."
|
||||
|
||||
# From Paul Eggert (2016-10-03):
|
||||
# For now, guess DST from 02:00 the first Sunday in November to
|
||||
# 03:00 the third Sunday in January. Although ad hoc, it matches
|
||||
# transitions since late 2014 and seems more likely to match future
|
||||
|
@ -1908,7 +1908,7 @@ Zone Europe/Monaco 0:29:32 - LMT 1891 Mar 15
|
||||
# Amsterdam mean time.
|
||||
|
||||
# The data entries before 1945 are taken from
|
||||
# http://www.phys.uu.nl/~vgent/wettijd/wettijd.htm
|
||||
# http://www.staff.science.uu.nl/~gent0113/idl/idl.htm
|
||||
|
||||
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
|
||||
Rule Neth 1916 only - May 1 0:00 1:00 NST # Netherlands Summer Time
|
||||
@ -3427,22 +3427,24 @@ Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16 # See above comment.
|
||||
|
||||
# Turkey
|
||||
|
||||
# From Amar Devegowda (2007-01-03):
|
||||
# The time zone rules for Istanbul, Turkey have not been changed for years now.
|
||||
# ... The latest rules are available at:
|
||||
# http://www.timeanddate.com/worldclock/timezone.html?n=107
|
||||
# From Steffen Thorsen (2007-01-03):
|
||||
# I have been able to find press records back to 1996 which all say that
|
||||
# DST started 01:00 local time and end at 02:00 local time. I am not sure
|
||||
# what happened before that. One example for each year from 1996 to 2001:
|
||||
# http://newspot.byegm.gov.tr/arsiv/1996/21/N4.htm
|
||||
# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING97/03/97X03X25.TXT
|
||||
# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING98/03/98X03X02.HTM
|
||||
# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING99/10/99X10X26.HTM#%2016
|
||||
# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING2000/03/00X03X06.HTM#%2021
|
||||
# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING2001/03/23x03x01.HTM#%2027
|
||||
# From Paul Eggert (2007-01-03):
|
||||
# Prefer the above source to Shanks & Pottenger for time stamps after 1990.
|
||||
# From Kıvanç Yazan (2016-09-25):
|
||||
# 1) For 1986-2006, DST started at 01:00 local and ended at 02:00 local, with
|
||||
# no exceptions.
|
||||
# 2) 1994's lastSun was overridden with Mar 20 ...
|
||||
# Here are official papers:
|
||||
# http://www.resmigazete.gov.tr/arsiv/19032.pdf - page 2 for 1986
|
||||
# http://www.resmigazete.gov.tr/arsiv/19400.pdf - page 4 for 1987
|
||||
# http://www.resmigazete.gov.tr/arsiv/19752.pdf - page 15 for 1988
|
||||
# http://www.resmigazete.gov.tr/arsiv/20102.pdf - page 6 for 1989
|
||||
# http://www.resmigazete.gov.tr/arsiv/20464.pdf - page 1 for 1990 - 1992
|
||||
# http://www.resmigazete.gov.tr/arsiv/21531.pdf - page 15 for 1993 - 1995
|
||||
# http://www.resmigazete.gov.tr/arsiv/21879.pdf - page 1 for overriding 1994
|
||||
# http://www.resmigazete.gov.tr/arsiv/22588.pdf - page 1 for 1996, 1997
|
||||
# http://www.resmigazete.gov.tr/arsiv/23286.pdf - page 10 for 1998 - 2000
|
||||
# http://www.resmigazete.gov.tr/eskiler/2001/03/20010324.htm#2 - for 2001
|
||||
# http://www.resmigazete.gov.tr/eskiler/2002/03/20020316.htm#2 - for 2002-2006
|
||||
# From Paul Eggert (2016-09-25):
|
||||
# Prefer the above sources to Shanks & Pottenger for time stamps after 1985.
|
||||
|
||||
# From Steffen Thorsen (2007-03-09):
|
||||
# Starting 2007 though, it seems that they are adopting EU's 1:00 UTC
|
||||
@ -3551,10 +3553,10 @@ Rule Turkey 1983 only - Jul 31 0:00 1:00 S
|
||||
Rule Turkey 1983 only - Oct 2 0:00 0 -
|
||||
Rule Turkey 1985 only - Apr 20 0:00 1:00 S
|
||||
Rule Turkey 1985 only - Sep 28 0:00 0 -
|
||||
Rule Turkey 1986 1990 - Mar lastSun 2:00s 1:00 S
|
||||
Rule Turkey 1986 1990 - Sep lastSun 2:00s 0 -
|
||||
Rule Turkey 1991 2006 - Mar lastSun 1:00s 1:00 S
|
||||
Rule Turkey 1991 1995 - Sep lastSun 1:00s 0 -
|
||||
Rule Turkey 1986 1993 - Mar lastSun 1:00s 1:00 S
|
||||
Rule Turkey 1986 1995 - Sep lastSun 1:00s 0 -
|
||||
Rule Turkey 1994 only - Mar 20 1:00s 1:00 S
|
||||
Rule Turkey 1995 2006 - Mar lastSun 1:00s 1:00 S
|
||||
Rule Turkey 1996 2006 - Oct lastSun 1:00s 0 -
|
||||
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
|
||||
Zone Europe/Istanbul 1:55:52 - LMT 1880
|
||||
|
@ -24,8 +24,32 @@
|
||||
# was the result of his proposals at the Convention of Railroad Trunk Lines
|
||||
# in New York City (1869-10). His 1870 proposal was based on Washington, DC,
|
||||
# but in 1872-05 he moved the proposed origin to Greenwich.
|
||||
# His proposal was adopted by the railroads on 1883-11-18 at 12:00,
|
||||
# and the most of the country soon followed suit.
|
||||
|
||||
# From Paul Eggert (2016-09-21):
|
||||
# Dowd's proposal left many details unresolved, such as where to draw
|
||||
# lines between time zones. The key individual who made time zones
|
||||
# work in the US was William Frederick Allen - railway engineer,
|
||||
# managing editor of the Travelers' Guide, and secretary of the
|
||||
# General Time Convention, a railway standardization group. Allen
|
||||
# spent months in dialogs with scientific and railway leaders,
|
||||
# developed a workable plan to institute time zones, and presented it
|
||||
# to the General Time Convention on 1883-04-11, saying that his plan
|
||||
# meant "local time would be practically abolished" - a plus for
|
||||
# railway scheduling. By the next convention on 1883-10-11 nearly all
|
||||
# railroads had agreed and it took effect on 1883-11-18 at 12:00.
|
||||
# That Sunday was called the "day of two noons", as the eastern parts
|
||||
# of the new zones observed noon twice. Allen witnessed the
|
||||
# transition in New York City, writing:
|
||||
#
|
||||
# I heard the bells of St. Paul's strike on the old time. Four
|
||||
# minutes later, obedient to the electrical signal from the Naval
|
||||
# Observatory ... the time-ball made its rapid descent, the chimes
|
||||
# of old Trinity rang twelve measured strokes, and local time was
|
||||
# abandoned, probably forever.
|
||||
#
|
||||
# Most of the US soon followed suit. See:
|
||||
# Bartky IR. The adoption of standard time. Technol Cult 1989 Jan;30(1):25-56.
|
||||
# http://dx.doi.org/10.2307/3105430
|
||||
|
||||
# From Paul Eggert (2005-04-16):
|
||||
# That 1883 transition occurred at 12:00 new time, not at 12:00 old time.
|
||||
|
@ -42,7 +42,7 @@ $code=<<___;
|
||||
#if __ARM_MAX_ARCH__>=7
|
||||
.text
|
||||
___
|
||||
$code.=".arch armv8-a+crypto\n" if ($flavour =~ /64/);
|
||||
# $code.=".arch armv8-a+crypto\n" if ($flavour =~ /64/);
|
||||
$code.=".arch armv7-a\n.fpu neon\n.code 32\n" if ($flavour !~ /64/);
|
||||
#^^^^^^ this is done to simplify adoption by not depending
|
||||
# on latest binutils.
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "arm_arch.h"
|
||||
|
||||
.text
|
||||
.arch armv8-a+crypto
|
||||
|
||||
.align 5
|
||||
.global _armv7_neon_probe
|
||||
|
@ -49,7 +49,7 @@ $code=<<___;
|
||||
|
||||
.text
|
||||
___
|
||||
$code.=".arch armv8-a+crypto\n" if ($flavour =~ /64/);
|
||||
# $code.=".arch armv8-a+crypto\n" if ($flavour =~ /64/);
|
||||
$code.=".fpu neon\n.code 32\n" if ($flavour !~ /64/);
|
||||
|
||||
################################################################################
|
||||
|
@ -2713,7 +2713,7 @@ nomatch 32 {
|
||||
match "bus" "uhub[0-9]+";
|
||||
match "mode" "host";
|
||||
match "vendor" "0x0bda";
|
||||
match "product" "0x8152";
|
||||
match "product" "(0x8152|0x8153)";
|
||||
action "kldload -n if_ure";
|
||||
};
|
||||
|
||||
|
@ -32,6 +32,8 @@
|
||||
..
|
||||
casper
|
||||
..
|
||||
cron.d
|
||||
..
|
||||
defaults
|
||||
..
|
||||
devd
|
||||
|
6
etc/rc
6
etc/rc
@ -135,16 +135,16 @@ done
|
||||
# Note: this assumes firstboot_sentinel is on / when we have
|
||||
# a read-only /, or that it is on media that's writable.
|
||||
if [ -e ${firstboot_sentinel} ]; then
|
||||
[ ${root_rw_mount#[Yy][Ee][Ss]} = "" ] || mount -uw /
|
||||
checkyesno root_rw_mount && mount -uw /
|
||||
chflags -R 0 ${firstboot_sentinel}
|
||||
rm -rf ${firstboot_sentinel}
|
||||
if [ -e ${firstboot_sentinel}-reboot ]; then
|
||||
chflags -R 0 ${firstboot_sentinel}-reboot
|
||||
rm -rf ${firstboot_sentinel}-reboot
|
||||
[ ${root_rw_mount#[Yy][Ee][Ss]} = "" ] || mount -ur /
|
||||
checkyesno root_rw_mount && mount -ur /
|
||||
kill -INT 1
|
||||
fi
|
||||
[ ${root_rw_mount#[Yy][Ee][Ss]} = "" ] || mount -ur /
|
||||
checkyesno root_rw_mount && mount -ur /
|
||||
fi
|
||||
|
||||
echo ''
|
||||
|
@ -118,14 +118,17 @@ FILES= DAEMON \
|
||||
ugidfw \
|
||||
${_utx} \
|
||||
var \
|
||||
watchdogd \
|
||||
ypbind \
|
||||
watchdogd
|
||||
|
||||
.if ${MK_NIS} != "no"
|
||||
FILES+= ypbind \
|
||||
ypldap \
|
||||
yppasswdd \
|
||||
ypserv \
|
||||
ypset \
|
||||
ypupdated \
|
||||
ypxfrd
|
||||
.endif
|
||||
|
||||
.if ${MK_ACCT} != "no"
|
||||
FILESGROUPS+= ACCT
|
||||
|
@ -12,7 +12,7 @@
|
||||
name="swaplate"
|
||||
desc="Setup late swap space"
|
||||
start_cmd='/sbin/swapon -aLq'
|
||||
stop_cmd='/sbin/swapoff -aq'
|
||||
stop_cmd='/sbin/swapoff -aLq'
|
||||
|
||||
load_rc_config swap
|
||||
run_rc_command "$1"
|
||||
|
@ -165,7 +165,7 @@ LIBADD+= compiler_rt
|
||||
.if ${TARGET_CPUARCH} == mips
|
||||
LIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c
|
||||
# ABIs other than o32 need this
|
||||
.if ${TARGET_ARCH} != "mips" && ${TARGET_ARCH} != "mipsel"
|
||||
.if ${TARGET_ARCH:Mmips64*} != "" || ${TARGET_ARCH:Mmipsn32*} != ""
|
||||
LIB2FUNCS_EXTRA+= floatdidf.c fixunsdfsi.c
|
||||
LIB2FUNCS_EXTRA+= floatdisf.c floatundidf.c
|
||||
LIB2FUNCS_EXTRA+= fixsfdi.c floatundisf.c
|
||||
@ -173,7 +173,7 @@ LIB2FUNCS_EXTRA+= fixdfdi.c fixunssfsi.c
|
||||
.endif
|
||||
.endif
|
||||
|
||||
.if ${TARGET_ARCH} == "powerpc"
|
||||
.if ${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "powerpcspe"
|
||||
# from config/rs6000/t-ppccomm
|
||||
LIB2FUNCS_EXTRA = tramp.asm
|
||||
LIB2FUNCS_STATIC_EXTRA = eabi.asm
|
||||
|
@ -24,7 +24,7 @@ VERSION_MAP= ${SRCDIR}/libgomp.map
|
||||
|
||||
# Target-specific OpenMP configuration
|
||||
.if ${MACHINE_CPUARCH} == arm || ${MACHINE_CPUARCH} == i386 || \
|
||||
${MACHINE_ARCH} == powerpc || \
|
||||
${MACHINE_ARCH} == powerpc || ${MACHINE_ARCH} == powerpcspe || \
|
||||
(${MACHINE_CPUARCH} == mips && ${MACHINE_ARCH:Mmips64*} == "")
|
||||
OMP_LOCK_ALIGN = 4
|
||||
OMP_LOCK_KIND= 4
|
||||
|
@ -7,7 +7,7 @@
|
||||
VERSION= "2.17.50 [FreeBSD] 2007-07-03"
|
||||
|
||||
.if defined(TARGET_ARCH)
|
||||
TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
|
||||
TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?(hf)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc(64|spe)/powerpc/}
|
||||
.else
|
||||
TARGET_CPUARCH=${MACHINE_CPUARCH}
|
||||
.endif
|
||||
@ -17,7 +17,7 @@ TARGET_OS?= freebsd
|
||||
BINUTILS_ARCH=${TARGET_ARCH:C/amd64/x86_64/}
|
||||
TARGET_TUPLE?= ${BINUTILS_ARCH}-${TARGET_VENDOR}-${TARGET_OS}
|
||||
.if ${TARGET_ARCH} == "armeb" || ${TARGET_ARCH} == "armv6eb" || \
|
||||
(${TARGET_CPUARCH} == "mips" && ${TARGET_ARCH:Mmips*el} == "")
|
||||
(${TARGET_CPUARCH} == "mips" && ${TARGET_ARCH:Mmips*el*} == "")
|
||||
TARGET_BIG_ENDIAN=t
|
||||
.endif
|
||||
|
||||
@ -30,7 +30,7 @@ RELSRC= ${RELTOP}/../../../contrib/binutils
|
||||
SRCDIR= ${.CURDIR}/${RELSRC}
|
||||
|
||||
.if ${TARGET_CPUARCH} == "arm" || ${TARGET_CPUARCH} == "i386" || \
|
||||
${TARGET_ARCH} == "powerpc" || \
|
||||
${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "powerpcspe" || \
|
||||
(${TARGET_CPUARCH} == "mips" && ${TARGET_ARCH:Mmips64*} == "")
|
||||
CFLAGS+= -DBFD_DEFAULT_TARGET_SIZE=32
|
||||
.else
|
||||
|
@ -1,6 +1,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.if ${TARGET_ARCH:Mmips*el} != ""
|
||||
.if ${TARGET_ARCH:Mmips*el*} != ""
|
||||
_EMULATION_ENDIAN=l
|
||||
.else
|
||||
_EMULATION_ENDIAN=b
|
||||
|
@ -1,6 +1,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.if ${TARGET_ARCH:Mmips*el} != ""
|
||||
.if ${TARGET_ARCH:Mmips*el*} != ""
|
||||
_EMULATION_ENDIAN=little
|
||||
.else
|
||||
_EMULATION_ENDIAN=big
|
||||
|
@ -39,7 +39,7 @@ CFLAGS += -DFREEBSD_ARCH_armv6
|
||||
.endif
|
||||
|
||||
.if ${TARGET_CPUARCH} == "mips"
|
||||
.if ${TARGET_ARCH:Mmips*el} != ""
|
||||
.if ${TARGET_ARCH:Mmips*el*} != ""
|
||||
CFLAGS += -DTARGET_ENDIAN_DEFAULT=0
|
||||
.endif
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
# MACHINE_CPUARCH, but there's no easy way to export make functions...
|
||||
|
||||
.if defined(TARGET_ARCH)
|
||||
TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
|
||||
TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?(hf)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc(64|spe)/powerpc/}
|
||||
.else
|
||||
TARGET_CPUARCH=${MACHINE_CPUARCH}
|
||||
.endif
|
||||
@ -15,7 +15,7 @@ GCC_CPU=${TARGET_CPUARCH:C/amd64/i386/:C/powerpc/rs6000/:C/sparc64/sparc/}
|
||||
TARGET_CPU_DEFAULT= TARGET_CPU_ultrasparc
|
||||
.endif
|
||||
.if ${TARGET_ARCH} == "armeb" || ${TARGET_ARCH} == "armv6eb" || \
|
||||
(${TARGET_CPUARCH} == "mips" && ${TARGET_ARCH:Mmips*el} == "")
|
||||
(${TARGET_CPUARCH} == "mips" && ${TARGET_ARCH:Mmips*el*} == "")
|
||||
TARGET_BIG_ENDIAN=t
|
||||
.endif
|
||||
.if ${TARGET_ARCH} == "powerpc64"
|
||||
|
@ -46,6 +46,10 @@ TARGET_INC+= ${GCC_CPU}/bpabi.h
|
||||
TARGET_INC+= ${GCC_CPU}/biarch64.h
|
||||
TARGET_INC+= ${GCC_CPU}/default64.h
|
||||
.endif
|
||||
.if ${TARGET_ARCH} == "powerpcspe"
|
||||
TARGET_INC+= ${GCC_CPU}/freebsdspe.h
|
||||
TARGET_INC+= ${GCC_CPU}/e500-double.h
|
||||
.endif
|
||||
TARGET_INC+= ${GCC_CPU}/freebsd.h
|
||||
.if ${TARGET_CPUARCH} == "amd64"
|
||||
TARGET_INC+= ${GCC_CPU}/freebsd64.h
|
||||
|
@ -14,7 +14,8 @@ INCS= ammintrin.h emmintrin.h mmintrin.h mm3dnow.h pmmintrin.h \
|
||||
INCS+= wmmintrin.h __wmmintrin_aes.h __wmmintrin_pclmul.h
|
||||
.elif ${TARGET_ARCH} == "arm"
|
||||
INCS= mmintrin.h
|
||||
.elif ${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "powerpc64"
|
||||
.elif ${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "powerpc64" || \
|
||||
${TARGET_ARCH} == "powerpcspe"
|
||||
INCS= ppc-asm.h altivec.h spe.h
|
||||
.endif
|
||||
|
||||
|
@ -23,7 +23,7 @@ OBJ_RL= ${OBJ_ROOT}/../lib/libreadline/readline
|
||||
# MACHINE_CPUARCH, but there's no easy way to export make functions...
|
||||
|
||||
.if defined(TARGET_ARCH)
|
||||
TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
|
||||
TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?(hf)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc(64|spe)/powerpc/}
|
||||
.else
|
||||
TARGET_CPUARCH=${MACHINE_CPUARCH}
|
||||
.endif
|
||||
|
@ -4,7 +4,7 @@
|
||||
# MACHINE_CPUARCH, but there's no easy way to export make functions...
|
||||
|
||||
.if defined(TARGET_ARCH)
|
||||
TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/}
|
||||
TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?(hf)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc(64|spe)/powerpc/}
|
||||
.else
|
||||
TARGET_CPUARCH=${MACHINE_CPUARCH}
|
||||
.endif
|
||||
|
@ -120,7 +120,7 @@
|
||||
#endif
|
||||
|
||||
#if __XSI_VISIBLE || __POSIX_VISIBLE >= 200809
|
||||
#define NL_ARGMAX 99 /* max # of position args for printf */
|
||||
#define NL_ARGMAX 65536 /* max # of position args for printf */
|
||||
#define NL_MSGMAX 32767
|
||||
#define NL_SETMAX 255
|
||||
#define NL_TEXTMAX 2048
|
||||
|
@ -62,6 +62,14 @@ typedef ___wchar_t wchar_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L
|
||||
#ifndef __CLANG_MAX_ALIGN_T_DEFINED
|
||||
typedef __max_align_t max_align_t;
|
||||
#define __CLANG_MAX_ALIGN_T_DEFINED
|
||||
#define __GCC_MAX_ALIGN_T
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define offsetof(type, member) __offsetof(type, member)
|
||||
|
||||
#endif /* _STDDEF_H_ */
|
||||
|
@ -30,7 +30,7 @@ SHARED_CFLAGS+= -DHAVE_ICONV=1 -DHAVE_ICONV_H=1 -DICONV_CONST=
|
||||
.endif
|
||||
|
||||
.if ${MACHINE_ARCH:Marm*} != "" || ${MACHINE_ARCH:Mmips*} != "" || \
|
||||
${MACHINE_ARCH:Msparc64*} != ""
|
||||
${MACHINE_ARCH:Msparc64*} != "" || ${MACHINE_ARCH:Mpowerpc*} != ""
|
||||
NO_WCAST_ALIGN= yes
|
||||
.if ${MACHINE_ARCH:M*64*} == ""
|
||||
CFLAGS+= -DPPMD_32BIT
|
||||
|
@ -111,7 +111,7 @@ NOASM=
|
||||
.include "${LIBC_SRCTOP}/xdr/Makefile.inc"
|
||||
.if (${LIBC_ARCH} == "arm" && \
|
||||
(${MACHINE_ARCH:Marmv6*} == "" || (defined(CPUTYPE) && ${CPUTYPE:M*soft*}))) || \
|
||||
${LIBC_ARCH} == "mips"
|
||||
(${LIBC_ARCH} == "mips" && ${MACHINE_ARCH:Mmips*hf} == "")
|
||||
.include "${LIBC_SRCTOP}/softfloat/Makefile.inc"
|
||||
.endif
|
||||
.if ${LIBC_ARCH} == "i386" || ${LIBC_ARCH} == "amd64"
|
||||
|
@ -183,16 +183,16 @@ The top level names are defined with a CTL_ prefix in
|
||||
and are as follows.
|
||||
The next and subsequent levels down are found in the include files
|
||||
listed here, and described in separate sections below.
|
||||
.Bl -column CTLXMACHDEPXXX "Next level namesXXXXXX" -offset indent
|
||||
.It Sy "Name Next level names Description"
|
||||
.It "CTL_DEBUG sys/sysctl.h Debugging"
|
||||
.It "CTL_VFS sys/mount.h File system"
|
||||
.It "CTL_HW sys/sysctl.h Generic CPU, I/O"
|
||||
.It "CTL_KERN sys/sysctl.h High kernel limits"
|
||||
.It "CTL_MACHDEP sys/sysctl.h Machine dependent"
|
||||
.It "CTL_NET sys/socket.h Networking"
|
||||
.It "CTL_USER sys/sysctl.h User-level"
|
||||
.It "CTL_VM vm/vm_param.h Virtual memory"
|
||||
.Bl -column CTLXMACHDEPXXX "Next Level NamesXXXXXX" -offset indent
|
||||
.It Sy Name Ta Sy Next Level Names Ta Sy Description
|
||||
.It Dv CTL_DEBUG Ta In sys/sysctl.h Ta Debugging
|
||||
.It Dv CTL_VFS Ta In sys/mount.h Ta File system
|
||||
.It Dv CTL_HW Ta In sys/sysctl.h Ta Generic CPU, I/O
|
||||
.It Dv CTL_KERN Ta In sys/sysctl.h Ta High kernel limits
|
||||
.It Dv CTL_MACHDEP Ta In sys/sysctl.h Ta Machine dependent
|
||||
.It Dv CTL_NET Ta In sys/socket.h Ta Networking
|
||||
.It Dv CTL_USER Ta In sys/sysctl.h Ta User-level
|
||||
.It Dv CTL_VM Ta In vm/vm_param.h Ta Virtual memory
|
||||
.El
|
||||
.Pp
|
||||
For example, the following retrieves the maximum number of processes allowed
|
||||
@ -270,20 +270,20 @@ The string and integer information available for the CTL_HW level
|
||||
is detailed below.
|
||||
The changeable column shows whether a process with appropriate
|
||||
privilege may change the value.
|
||||
.Bl -column "Second level nameXXXXXX" integerXXX -offset indent
|
||||
.It Sy "Second level name Type Changeable"
|
||||
.It "HW_MACHINE string no"
|
||||
.It "HW_MODEL string no"
|
||||
.It "HW_NCPU integer no"
|
||||
.It "HW_BYTEORDER integer no"
|
||||
.It "HW_PHYSMEM integer no"
|
||||
.It "HW_USERMEM integer no"
|
||||
.It "HW_PAGESIZE integer no"
|
||||
.\".It "HW_DISKNAMES integer no"
|
||||
.\".It "HW_DISKSTATS integer no"
|
||||
.It "HW_FLOATINGPT integer no"
|
||||
.It "HW_MACHINE_ARCH string no"
|
||||
.It "HW_REALMEM integer no"
|
||||
.Bl -column "Second Level Name" integerXXX Changeable -offset indent
|
||||
.It Sy Second Level Name Ta Sy Type Ta Sy Changeable
|
||||
.It Dv HW_MACHINE Ta string Ta no
|
||||
.It Dv HW_MODEL Ta string Ta no
|
||||
.It Dv HW_NCPU Ta integer Ta no
|
||||
.It Dv HW_BYTEORDER Ta integer Ta no
|
||||
.It Dv HW_PHYSMEM Ta integer Ta no
|
||||
.It Dv HW_USERMEM Ta integer Ta no
|
||||
.It Dv HW_PAGESIZE Ta integer Ta no
|
||||
.\".It Dv HW_DISKNAMES Ta integer Ta no
|
||||
.\".It Dv HW_DISKSTATS Ta integer Ta no
|
||||
.It Dv HW_FLOATINGPT Ta integer Ta no
|
||||
.It Dv HW_MACHINE_ARCH Ta string Ta no
|
||||
.It Dv HW_REALMEM Ta integer Ta no
|
||||
.El
|
||||
.Bl -tag -width 6n
|
||||
.It Li HW_MACHINE
|
||||
@ -293,7 +293,7 @@ The machine model
|
||||
.It Li HW_NCPU
|
||||
The number of cpus.
|
||||
.It Li HW_BYTEORDER
|
||||
The byteorder (4,321, or 1,234).
|
||||
The byteorder (4321 or 1234).
|
||||
.It Li HW_PHYSMEM
|
||||
The bytes of physical memory.
|
||||
.It Li HW_USERMEM
|
||||
@ -319,36 +319,36 @@ system vnodes, the open file entries, routing table entries,
|
||||
virtual memory statistics, load average history, and clock rate
|
||||
information.
|
||||
.Bl -column "KERNXMAXFILESPERPROCXXX" "struct clockrateXXX" -offset indent
|
||||
.It Sy "Second level name Type Changeable"
|
||||
.It "KERN_ARGMAX integer no"
|
||||
.It "KERN_BOOTFILE string yes"
|
||||
.It "KERN_BOOTTIME struct timeval no"
|
||||
.It "KERN_CLOCKRATE struct clockinfo no"
|
||||
.It "KERN_FILE struct xfile no"
|
||||
.It "KERN_HOSTID integer yes"
|
||||
.It "KERN_HOSTUUID string yes"
|
||||
.It "KERN_HOSTNAME string yes"
|
||||
.It "KERN_JOB_CONTROL integer no"
|
||||
.It "KERN_MAXFILES integer yes"
|
||||
.It "KERN_MAXFILESPERPROC integer yes"
|
||||
.It "KERN_MAXPROC integer no"
|
||||
.It "KERN_MAXPROCPERUID integer yes"
|
||||
.It "KERN_MAXVNODES integer yes"
|
||||
.It "KERN_NGROUPS integer no"
|
||||
.It "KERN_NISDOMAINNAME string yes"
|
||||
.It "KERN_OSRELDATE integer no"
|
||||
.It "KERN_OSRELEASE string no"
|
||||
.It "KERN_OSREV integer no"
|
||||
.It "KERN_OSTYPE string no"
|
||||
.It "KERN_POSIX1 integer no"
|
||||
.It "KERN_PROC node not applicable"
|
||||
.It "KERN_PROF node not applicable"
|
||||
.It "KERN_QUANTUM integer yes"
|
||||
.It "KERN_SAVED_IDS integer no"
|
||||
.It "KERN_SECURELVL integer raise only"
|
||||
.It "KERN_UPDATEINTERVAL integer no"
|
||||
.It "KERN_VERSION string no"
|
||||
.It "KERN_VNODE struct xvnode no"
|
||||
.It Sy Second Level Name Ta Sy Type Ta Sy Changeable
|
||||
.It Dv KERN_ARGMAX Ta integer Ta no
|
||||
.It Dv KERN_BOOTFILE Ta string Ta yes
|
||||
.It Dv KERN_BOOTTIME Ta struct timeval Ta no
|
||||
.It Dv KERN_CLOCKRATE Ta struct clockinfo Ta no
|
||||
.It Dv KERN_FILE Ta struct xfile Ta no
|
||||
.It Dv KERN_HOSTID Ta integer Ta yes
|
||||
.It Dv KERN_HOSTUUID Ta string Ta yes
|
||||
.It Dv KERN_HOSTNAME Ta string Ta yes
|
||||
.It Dv KERN_JOB_CONTROL Ta integer Ta no
|
||||
.It Dv KERN_MAXFILES Ta integer Ta yes
|
||||
.It Dv KERN_MAXFILESPERPROC Ta integer Ta yes
|
||||
.It Dv KERN_MAXPROC Ta integer Ta no
|
||||
.It Dv KERN_MAXPROCPERUID Ta integer Ta yes
|
||||
.It Dv KERN_MAXVNODES Ta integer Ta yes
|
||||
.It Dv KERN_NGROUPS Ta integer Ta no
|
||||
.It Dv KERN_NISDOMAINNAME Ta string Ta yes
|
||||
.It Dv KERN_OSRELDATE Ta integer Ta no
|
||||
.It Dv KERN_OSRELEASE Ta string Ta no
|
||||
.It Dv KERN_OSREV Ta integer Ta no
|
||||
.It Dv KERN_OSTYPE Ta string Ta no
|
||||
.It Dv KERN_POSIX1 Ta integer Ta no
|
||||
.It Dv KERN_PROC Ta node Ta not applicable
|
||||
.It Dv KERN_PROF Ta node Ta not applicable
|
||||
.It Dv KERN_QUANTUM Ta integer Ta yes
|
||||
.It Dv KERN_SAVED_IDS Ta integer Ta no
|
||||
.It Dv KERN_SECURELVL Ta integer Ta raise only
|
||||
.It Dv KERN_UPDATEINTERVAL Ta integer Ta no
|
||||
.It Dv KERN_VERSION Ta string Ta no
|
||||
.It Dv KERN_VNODE Ta struct xvnode Ta no
|
||||
.El
|
||||
.Bl -tag -width 6n
|
||||
.It Li KERN_ARGMAX
|
||||
@ -439,14 +439,14 @@ For the following names, an array of
|
||||
.Va struct kinfo_proc
|
||||
structures is returned,
|
||||
whose size depends on the current number of such objects in the system.
|
||||
.Bl -column "Third level nameXXXXXX" "Fourth level is:XXXXXX" -offset indent
|
||||
.It "Third level name Fourth level is:"
|
||||
.It "KERN_PROC_ALL None"
|
||||
.It "KERN_PROC_PID A process ID"
|
||||
.It "KERN_PROC_PGRP A process group"
|
||||
.It "KERN_PROC_TTY A tty device"
|
||||
.It "KERN_PROC_UID A user ID"
|
||||
.It "KERN_PROC_RUID A real user ID"
|
||||
.Bl -column "Third Level NameXXXXXX" "Fourth LevelXXXXXX" -offset indent
|
||||
.It Sy Third Level Name Ta Sy Fourth Level
|
||||
.It Dv KERN_PROC_ALL Ta None
|
||||
.It Dv KERN_PROC_PID Ta A process ID
|
||||
.It Dv KERN_PROC_PGRP Ta A process group
|
||||
.It Dv KERN_PROC_TTY Ta A tty device
|
||||
.It Dv KERN_PROC_UID Ta A user ID
|
||||
.It Dv KERN_PROC_RUID Ta A real user ID
|
||||
.El
|
||||
.Pp
|
||||
If the third level name is
|
||||
@ -465,8 +465,8 @@ For
|
||||
a process ID of
|
||||
.Li \-1
|
||||
implies the current process.
|
||||
.Bl -column "Third level nameXXXXXX" "Fourth level is:XXXXXX" -offset indent
|
||||
.It Sy "Third level name Fourth level is:"
|
||||
.Bl -column "Third Level NameXXXXXX" "Fourth LevelXXXXXX" -offset indent
|
||||
.It Sy Third Level Name Ta Sy Fourth Level
|
||||
.It Dv KERN_PROC_ARGS Ta "A process ID"
|
||||
.It Dv KERN_PROC_PATHNAME Ta "A process ID"
|
||||
.El
|
||||
@ -481,12 +481,12 @@ is detailed below.
|
||||
The changeable column shows whether a process with appropriate
|
||||
privilege may change the value.
|
||||
.Bl -column "GPROFXGMONPARAMXXX" "struct gmonparamXXX" -offset indent
|
||||
.It Sy "Third level name Type Changeable"
|
||||
.It "GPROF_STATE integer yes"
|
||||
.It "GPROF_COUNT u_short[\|] yes"
|
||||
.It "GPROF_FROMS u_short[\|] yes"
|
||||
.It "GPROF_TOS struct tostruct yes"
|
||||
.It "GPROF_GMONPARAM struct gmonparam no"
|
||||
.It Sy Third Level Name Ta Sy Type Ta Sy Changeable
|
||||
.It Dv GPROF_STATE Ta integer Ta yes
|
||||
.It Dv GPROF_COUNT Ta u_short[\|] Ta yes
|
||||
.It Dv GPROF_FROMS Ta u_short[\|] Ta yes
|
||||
.It Dv GPROF_TOS Ta struct tostruct Ta yes
|
||||
.It Dv GPROF_GMONPARAM Ta struct gmonparam Ta no
|
||||
.El
|
||||
.Pp
|
||||
The variables are as follows:
|
||||
@ -530,11 +530,11 @@ The string and integer information available for the CTL_NET level
|
||||
is detailed below.
|
||||
The changeable column shows whether a process with appropriate
|
||||
privilege may change the value.
|
||||
.Bl -column "Second level nameXXXXXX" "routing messagesXXX" -offset indent
|
||||
.It Sy "Second level name Type Changeable"
|
||||
.It "PF_ROUTE routing messages no"
|
||||
.It "PF_INET IPv4 values yes"
|
||||
.It "PF_INET6 IPv6 values yes"
|
||||
.Bl -column "Second Level NameXXXXXX" "routing messagesXXX" -offset indent
|
||||
.It Sy Second Level Name Ta Sy Type Ta Sy Changeable
|
||||
.It Dv PF_ROUTE Ta routing messages Ta no
|
||||
.It Dv PF_INET Ta IPv4 values Ta yes
|
||||
.It Dv PF_INET6 Ta IPv6 values Ta yes
|
||||
.El
|
||||
.Bl -tag -width 6n
|
||||
.It Li PF_ROUTE
|
||||
@ -548,13 +548,13 @@ The third level name is a protocol number, which is currently always 0.
|
||||
The fourth level name is an address family, which may be set to 0 to
|
||||
select all address families.
|
||||
The fifth, sixth, and seventh level names are as follows:
|
||||
.Bl -column -offset indent "Fifth level Sixth level" "Seventh level"
|
||||
.It Sy "Fifth level Sixth level" Ta Sy "Seventh level"
|
||||
.It "NET_RT_FLAGS rtflags" Ta "None"
|
||||
.It "NET_RT_DUMP None" Ta "None or fib number"
|
||||
.It "NET_RT_IFLIST 0 or if_index" Ta None
|
||||
.It "NET_RT_IFMALIST 0 or if_index" Ta None
|
||||
.It "NET_RT_IFLISTL 0 or if_index" Ta None
|
||||
.Bl -column -offset indent "Fifth Level" "Sixth Level" "Seventh Level"
|
||||
.It Sy Fifth level Ta Sy Sixth Level Ta Sy Seventh Level
|
||||
.It Dv NET_RT_FLAGS Ta rtflags Ta None
|
||||
.It Dv NET_RT_DUMP Ta None Ta None or fib number
|
||||
.It Dv NET_RT_IFLIST Ta 0 or if_index Ta None
|
||||
.It Dv NET_RT_IFMALIST Ta 0 or if_index Ta None
|
||||
.It Dv NET_RT_IFLISTL Ta 0 or if_index Ta None
|
||||
.El
|
||||
.Pp
|
||||
The
|
||||
@ -582,13 +582,13 @@ The third level name is the protocol.
|
||||
The fourth level name is the variable name.
|
||||
The currently defined protocols and names are:
|
||||
.Bl -column ProtocolXX VariableXX TypeXX ChangeableXX
|
||||
.It Sy "Protocol Variable Type Changeable"
|
||||
.It "icmp bmcastecho integer yes"
|
||||
.It "icmp maskrepl integer yes"
|
||||
.It "ip forwarding integer yes"
|
||||
.It "ip redirect integer yes"
|
||||
.It "ip ttl integer yes"
|
||||
.It "udp checksum integer yes"
|
||||
.It Sy Protocol Ta Sy Variable Ta Sy Type Ta Sy Changeable
|
||||
.It icmp Ta bmcastecho Ta integer Ta yes
|
||||
.It icmp Ta maskrepl Ta integer Ta yes
|
||||
.It ip Ta forwarding Ta integer Ta yes
|
||||
.It ip Ta redirect Ta integer Ta yes
|
||||
.It ip Ta ttl Ta integer Ta yes
|
||||
.It udp Ta checksum Ta integer Ta yes
|
||||
.El
|
||||
.Pp
|
||||
The variables are as follows:
|
||||
@ -633,27 +633,27 @@ is detailed below.
|
||||
The changeable column shows whether a process with appropriate
|
||||
privilege may change the value.
|
||||
.Bl -column "USER_COLL_WEIGHTS_MAXXXX" "integerXXX" -offset indent
|
||||
.It Sy "Second level name Type Changeable"
|
||||
.It "USER_BC_BASE_MAX integer no"
|
||||
.It "USER_BC_DIM_MAX integer no"
|
||||
.It "USER_BC_SCALE_MAX integer no"
|
||||
.It "USER_BC_STRING_MAX integer no"
|
||||
.It "USER_COLL_WEIGHTS_MAX integer no"
|
||||
.It "USER_CS_PATH string no"
|
||||
.It "USER_EXPR_NEST_MAX integer no"
|
||||
.It "USER_LINE_MAX integer no"
|
||||
.It "USER_POSIX2_CHAR_TERM integer no"
|
||||
.It "USER_POSIX2_C_BIND integer no"
|
||||
.It "USER_POSIX2_C_DEV integer no"
|
||||
.It "USER_POSIX2_FORT_DEV integer no"
|
||||
.It "USER_POSIX2_FORT_RUN integer no"
|
||||
.It "USER_POSIX2_LOCALEDEF integer no"
|
||||
.It "USER_POSIX2_SW_DEV integer no"
|
||||
.It "USER_POSIX2_UPE integer no"
|
||||
.It "USER_POSIX2_VERSION integer no"
|
||||
.It "USER_RE_DUP_MAX integer no"
|
||||
.It "USER_STREAM_MAX integer no"
|
||||
.It "USER_TZNAME_MAX integer no"
|
||||
.It Sy Second Level Name Ta Sy Type Ta Sy Changeable
|
||||
.It Dv USER_BC_BASE_MAX Ta integer Ta no
|
||||
.It Dv USER_BC_DIM_MAX Ta integer Ta no
|
||||
.It Dv USER_BC_SCALE_MAX Ta integer Ta no
|
||||
.It Dv USER_BC_STRING_MAX Ta integer Ta no
|
||||
.It Dv USER_COLL_WEIGHTS_MAX Ta integer Ta no
|
||||
.It Dv USER_CS_PATH Ta string Ta no
|
||||
.It Dv USER_EXPR_NEST_MAX Ta integer Ta no
|
||||
.It Dv USER_LINE_MAX Ta integer Ta no
|
||||
.It Dv USER_POSIX2_CHAR_TERM Ta integer Ta no
|
||||
.It Dv USER_POSIX2_C_BIND Ta integer Ta no
|
||||
.It Dv USER_POSIX2_C_DEV Ta integer Ta no
|
||||
.It Dv USER_POSIX2_FORT_DEV Ta integer Ta no
|
||||
.It Dv USER_POSIX2_FORT_RUN Ta integer Ta no
|
||||
.It Dv USER_POSIX2_LOCALEDEF Ta integer Ta no
|
||||
.It Dv USER_POSIX2_SW_DEV Ta integer Ta no
|
||||
.It Dv USER_POSIX2_UPE Ta integer Ta no
|
||||
.It Dv USER_POSIX2_VERSION Ta integer Ta no
|
||||
.It Dv USER_RE_DUP_MAX Ta integer Ta no
|
||||
.It Dv USER_STREAM_MAX Ta integer Ta no
|
||||
.It Dv USER_TZNAME_MAX Ta integer Ta no
|
||||
.El
|
||||
.Bl -tag -width 6n
|
||||
.It Li USER_BC_BASE_MAX
|
||||
@ -731,16 +731,16 @@ The string and integer information available for the CTL_VM level
|
||||
is detailed below.
|
||||
The changeable column shows whether a process with appropriate
|
||||
privilege may change the value.
|
||||
.Bl -column "Second level nameXXXXXX" "struct loadavgXXX" -offset indent
|
||||
.It Sy "Second level name Type Changeable"
|
||||
.It "VM_LOADAVG struct loadavg no"
|
||||
.It "VM_TOTAL struct vmtotal no"
|
||||
.It "VM_SWAPPING_ENABLED integer maybe"
|
||||
.It "VM_V_FREE_MIN integer yes"
|
||||
.It "VM_V_FREE_RESERVED integer yes"
|
||||
.It "VM_V_FREE_TARGET integer yes"
|
||||
.It "VM_V_INACTIVE_TARGET integer yes"
|
||||
.It "VM_V_PAGEOUT_FREE_MIN integer yes"
|
||||
.Bl -column "Second Level NameXXXXXX" "struct loadavgXXX" -offset indent
|
||||
.It Sy Second Level Name Ta Sy Type Ta Sy Changeable
|
||||
.It Dv VM_LOADAVG Ta struct loadavg Ta no
|
||||
.It Dv VM_TOTAL Ta struct vmtotal Ta no
|
||||
.It Dv VM_SWAPPING_ENABLED Ta integer Ta maybe
|
||||
.It Dv VM_V_FREE_MIN Ta integer Ta yes
|
||||
.It Dv VM_V_FREE_RESERVED Ta integer Ta yes
|
||||
.It Dv VM_V_FREE_TARGET Ta integer Ta yes
|
||||
.It Dv VM_V_INACTIVE_TARGET Ta integer Ta yes
|
||||
.It Dv VM_V_PAGEOUT_FREE_MIN Ta integer Ta yes
|
||||
.El
|
||||
.Bl -tag -width 6n
|
||||
.It Li VM_LOADAVG
|
||||
|
@ -1,7 +1,9 @@
|
||||
# $NetBSD: Makefile.inc,v 1.7 2005/09/17 11:49:39 tsutsui Exp $
|
||||
# $FreeBSD$
|
||||
|
||||
.if ${MACHINE_ARCH:Mmips*hf} == ""
|
||||
CFLAGS+=-DSOFTFLOAT
|
||||
.endif
|
||||
|
||||
MDSRCS+= machdep_ldisd.c
|
||||
SYM_MAPS+= ${LIBC_SRCTOP}/mips/Symbol.map
|
||||
|
@ -31,6 +31,10 @@ FBSD_1.0 {
|
||||
sbrk;
|
||||
};
|
||||
|
||||
FBSD_1.3 {
|
||||
__flt_rounds;
|
||||
};
|
||||
|
||||
FBSDprivate_1.0 {
|
||||
/* PSEUDO syscalls */
|
||||
__sys_getlogin;
|
||||
|
@ -1,7 +1,7 @@
|
||||
# $NetBSD: Makefile.inc,v 1.27 2005/10/07 17:16:40 tsutsui Exp $
|
||||
# $FreeBSD$
|
||||
|
||||
SRCS+= infinity.c fabs.c ldexp.c
|
||||
SRCS+= infinity.c fabs.c ldexp.c flt_rounds.c
|
||||
|
||||
# SRCS+= flt_rounds.c fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \
|
||||
# fpsetround.c fpsetsticky.c
|
||||
|
@ -11,7 +11,14 @@ __FBSDID("$FreeBSD$");
|
||||
__RCSID("$NetBSD: flt_rounds.c,v 1.5 2005/12/24 23:10:08 perry Exp $");
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <machine/float.h>
|
||||
#include <fenv.h>
|
||||
#include <float.h>
|
||||
|
||||
#ifdef SOFTFLOAT
|
||||
#include "softfloat-for-gcc.h"
|
||||
#include "milieu.h"
|
||||
#include "softfloat.h"
|
||||
#endif
|
||||
|
||||
static const int map[] = {
|
||||
1, /* round to nearest */
|
||||
@ -23,8 +30,13 @@ static const int map[] = {
|
||||
int
|
||||
__flt_rounds()
|
||||
{
|
||||
int x;
|
||||
int mode;
|
||||
|
||||
__asm("cfc1 %0,$31" : "=r" (x));
|
||||
return map[x & 0x03];
|
||||
#ifdef SOFTFLOAT
|
||||
mode = __softfloat_float_rounding_mode;
|
||||
#else
|
||||
__asm __volatile("cfc1 %0,$31" : "=r" (mode));
|
||||
#endif
|
||||
|
||||
return map[mode & 0x03];
|
||||
}
|
||||
|
6
lib/libc/powerpc/gen/Makefile.common
Normal file
6
lib/libc/powerpc/gen/Makefile.common
Normal file
@ -0,0 +1,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.PATH: ${LIBC_SRCTOP}/powerpc/gen
|
||||
|
||||
SRCS += _ctx_start.S eabi.S infinity.c ldexp.c makecontext.c \
|
||||
signalcontext.c syncicache.c _set_tp.c trivial-getcontextx.c
|
@ -1,11 +1,7 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SRCS += _ctx_start.S eabi.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c \
|
||||
.include "${LIBC_SRCTOP}/powerpc/gen/Makefile.common"
|
||||
|
||||
SRCS += fabs.S flt_rounds.c fpgetmask.c fpgetround.c \
|
||||
fpgetsticky.c fpsetmask.c fpsetround.c \
|
||||
infinity.c ldexp.c makecontext.c _setjmp.S \
|
||||
setjmp.S sigsetjmp.S signalcontext.c syncicache.c \
|
||||
_set_tp.c \
|
||||
trivial-getcontextx.c
|
||||
|
||||
|
||||
|
||||
_setjmp.S setjmp.S sigsetjmp.S
|
||||
|
8
lib/libc/powerpcspe/Makefile.inc
Normal file
8
lib/libc/powerpcspe/Makefile.inc
Normal file
@ -0,0 +1,8 @@
|
||||
# $FreeBSD$
|
||||
|
||||
CFLAGS+= -I${LIBC_SRCTOP}/powerpc
|
||||
SRCS+= trivial-vdso_tc.c
|
||||
|
||||
# Long double is 64-bits
|
||||
MDSRCS+=machdep_ldisd.c
|
||||
SYM_MAPS+=${LIBC_SRCTOP}/powerpc/Symbol.map
|
7
lib/libc/powerpcspe/gen/Makefile.inc
Normal file
7
lib/libc/powerpcspe/gen/Makefile.inc
Normal file
@ -0,0 +1,7 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.include "${LIBC_SRCTOP}/powerpc/gen/Makefile.common"
|
||||
|
||||
SRCS += fabs.S flt_rounds.c fpgetmask.c fpgetround.c \
|
||||
fpgetsticky.c fpsetmask.c fpsetround.c \
|
||||
_setjmp.S setjmp.S sigsetjmp.S
|
117
lib/libc/powerpcspe/gen/_setjmp.S
Normal file
117
lib/libc/powerpcspe/gen/_setjmp.S
Normal file
@ -0,0 +1,117 @@
|
||||
/*-
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
/* $NetBSD: _setjmp.S,v 1.1 1997/03/29 20:55:53 thorpej Exp $ */
|
||||
|
||||
#include <machine/asm.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* C library -- _setjmp, _longjmp
|
||||
*
|
||||
* _longjmp(a,v)
|
||||
* will generate a "return(v?v:1)" from the last call to
|
||||
* _setjmp(a)
|
||||
* by restoring registers from the stack.
|
||||
* The previous signal state is NOT restored.
|
||||
*
|
||||
* jmpbuf layout:
|
||||
* +------------+
|
||||
* | unused |
|
||||
* +------------+
|
||||
* | unused |
|
||||
* | |
|
||||
* | (4 words) |
|
||||
* | |
|
||||
* +------------+
|
||||
* | saved regs |
|
||||
* | ... |
|
||||
*/
|
||||
|
||||
ENTRY(_setjmp)
|
||||
mflr %r11
|
||||
mfcr %r12
|
||||
evstdd %r1,24+0*8(%r3)
|
||||
evstdd %r2,24+1*8(%r3)
|
||||
evstdd %r11,24+2*8(%r3)
|
||||
evstdd %r12,24+3*8(%r3)
|
||||
evstdd %r13,24+4*8(%r3)
|
||||
evstdd %r14,24+5*8(%r3)
|
||||
evstdd %r15,24+6*8(%r3)
|
||||
evstdd %r16,24+7*8(%r3)
|
||||
evstdd %r17,24+8*8(%r3)
|
||||
evstdd %r18,24+9*8(%r3)
|
||||
evstdd %r19,24+10*8(%r3)
|
||||
evstdd %r20,24+11*8(%r3)
|
||||
evstdd %r21,24+12*8(%r3)
|
||||
evstdd %r22,24+13*8(%r3)
|
||||
evstdd %r23,24+14*8(%r3)
|
||||
evstdd %r24,24+15*8(%r3)
|
||||
evstdd %r25,24+16*8(%r3)
|
||||
evstdd %r26,24+17*8(%r3)
|
||||
evstdd %r27,24+18*8(%r3)
|
||||
evstdd %r28,24+19*8(%r3)
|
||||
evstdd %r29,24+20*8(%r3)
|
||||
evstdd %r30,24+21*8(%r3)
|
||||
evstdd %r31,24+22*8(%r3)
|
||||
|
||||
li %r3,0
|
||||
blr
|
||||
END(_setjmp)
|
||||
|
||||
ENTRY(_longjmp)
|
||||
evldd %r1,24+0*8(%r3)
|
||||
evldd %r2,24+1*8(%r3)
|
||||
evldd %r11,24+2*8(%r3)
|
||||
evldd %r12,24+3*8(%r3)
|
||||
evldd %r13,24+4*8(%r3)
|
||||
evldd %r14,24+5*8(%r3)
|
||||
evldd %r15,24+6*8(%r3)
|
||||
evldd %r16,24+7*8(%r3)
|
||||
evldd %r17,24+8*8(%r3)
|
||||
evldd %r18,24+9*8(%r3)
|
||||
evldd %r19,24+10*8(%r3)
|
||||
evldd %r20,24+11*8(%r3)
|
||||
evldd %r21,24+12*8(%r3)
|
||||
evldd %r22,24+13*8(%r3)
|
||||
evldd %r23,24+14*8(%r3)
|
||||
evldd %r24,24+15*8(%r3)
|
||||
evldd %r25,24+16*8(%r3)
|
||||
evldd %r26,24+17*8(%r3)
|
||||
evldd %r27,24+18*8(%r3)
|
||||
evldd %r28,24+19*8(%r3)
|
||||
evldd %r29,24+20*8(%r3)
|
||||
evldd %r30,24+21*8(%r3)
|
||||
evldd %r31,24+22*8(%r3)
|
||||
|
||||
mtlr %r11
|
||||
mtcr %r12
|
||||
or. %r3,%r4,%r4
|
||||
bnelr
|
||||
li %r3,1
|
||||
blr
|
||||
END(_longjmp)
|
||||
|
||||
.section .note.GNU-stack,"",%progbits
|
38
lib/libc/powerpcspe/gen/fabs.S
Normal file
38
lib/libc/powerpcspe/gen/fabs.S
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <machine/asm.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* double fabs(double)
|
||||
*/
|
||||
ENTRY(fabs)
|
||||
efdabs %f1,%f1
|
||||
blr
|
||||
END(fabs)
|
||||
|
||||
.section .note.GNU-stack,"",%progbits
|
57
lib/libc/powerpcspe/gen/flt_rounds.c
Normal file
57
lib/libc/powerpcspe/gen/flt_rounds.c
Normal file
@ -0,0 +1,57 @@
|
||||
/* $NetBSD: flt_rounds.c,v 1.4.10.3 2002/03/22 20:41:53 nathanw Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Mark Brinicombe
|
||||
* for the NetBSD Project.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/float.h>
|
||||
#include <machine/spr.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
static const int map[] = {
|
||||
1, /* round to nearest */
|
||||
0, /* round to zero */
|
||||
2, /* round to positive infinity */
|
||||
3 /* round to negative infinity */
|
||||
};
|
||||
|
||||
int
|
||||
__flt_rounds()
|
||||
{
|
||||
uint32_t fpscr;
|
||||
|
||||
__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
|
||||
return map[(fpscr & 0x03)];
|
||||
}
|
||||
#endif
|
49
lib/libc/powerpcspe/gen/fpgetmask.c
Normal file
49
lib/libc/powerpcspe/gen/fpgetmask.c
Normal file
@ -0,0 +1,49 @@
|
||||
/* $NetBSD: fpgetmask.c,v 1.3 2002/01/13 21:45:47 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Dan Winship.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/spr.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
fp_except_t
|
||||
fpgetmask()
|
||||
{
|
||||
uint32_t fpscr;
|
||||
|
||||
__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
|
||||
return ((fp_except_t)((fpscr >> 3) & 0x1f));
|
||||
}
|
||||
#endif
|
49
lib/libc/powerpcspe/gen/fpgetround.c
Normal file
49
lib/libc/powerpcspe/gen/fpgetround.c
Normal file
@ -0,0 +1,49 @@
|
||||
/* $NetBSD: fpgetround.c,v 1.3 2002/01/13 21:45:47 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Dan Winship.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/spr.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
fp_rnd_t
|
||||
fpgetround()
|
||||
{
|
||||
uint32_t fpscr;
|
||||
|
||||
__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
|
||||
return ((fp_rnd_t)(fpscr & 0x3));
|
||||
}
|
||||
#endif
|
55
lib/libc/powerpcspe/gen/fpgetsticky.c
Normal file
55
lib/libc/powerpcspe/gen/fpgetsticky.c
Normal file
@ -0,0 +1,55 @@
|
||||
/* $NetBSD: fpgetsticky.c,v 1.3 2002/01/13 21:45:48 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Dan Winship.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#include "namespace.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/spr.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(fpgetsticky,_fpgetsticky)
|
||||
#endif
|
||||
|
||||
fp_except_t
|
||||
fpgetsticky()
|
||||
{
|
||||
uint32_t fpscr;
|
||||
|
||||
__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
|
||||
return ((fp_except_t)((fpscr >> 25) & 0x1f));
|
||||
}
|
||||
#endif
|
53
lib/libc/powerpcspe/gen/fpsetmask.c
Normal file
53
lib/libc/powerpcspe/gen/fpsetmask.c
Normal file
@ -0,0 +1,53 @@
|
||||
/* $NetBSD: fpsetmask.c,v 1.3 2002/01/13 21:45:48 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Dan Winship.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/spr.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
fp_except_t
|
||||
fpsetmask(fp_except_t mask)
|
||||
{
|
||||
uint32_t fpscr;
|
||||
fp_rnd_t old;
|
||||
|
||||
__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR));
|
||||
old = (fp_rnd_t)((fpscr >> 3) & 0x1f);
|
||||
fpscr = (fpscr & 0xffffff07) | (mask << 3);
|
||||
__asm__ __volatile("mtspr %1,%0" :: "r"(fpscr), "K"(SPR_SPEFSCR));
|
||||
return (old);
|
||||
}
|
||||
#endif
|
53
lib/libc/powerpcspe/gen/fpsetround.c
Normal file
53
lib/libc/powerpcspe/gen/fpsetround.c
Normal file
@ -0,0 +1,53 @@
|
||||
/* $NetBSD: fpsetround.c,v 1.3 2002/01/13 21:45:48 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Dan Winship.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <machine/spr.h>
|
||||
#include <ieeefp.h>
|
||||
|
||||
#ifndef _SOFT_FLOAT
|
||||
fp_rnd_t
|
||||
fpsetround(fp_rnd_t rnd_dir)
|
||||
{
|
||||
uint32_t fpscr;
|
||||
fp_rnd_t old;
|
||||
|
||||
__asm__ __volatile("mfspr %0, %1" : "=r"(fpscr) : "K"(SPR_SPEFSCR) );
|
||||
old = (fp_rnd_t)(fpscr & 0x3);
|
||||
fpscr = (fpscr & 0xfffffffc) | rnd_dir;
|
||||
__asm__ __volatile("mtspr %1, %0" :: "r"(fpscr), "K"(SPR_SPEFSCR));
|
||||
return (old);
|
||||
}
|
||||
#endif
|
138
lib/libc/powerpcspe/gen/setjmp.S
Normal file
138
lib/libc/powerpcspe/gen/setjmp.S
Normal file
@ -0,0 +1,138 @@
|
||||
/*-
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
/* $NetBSD: setjmp.S,v 1.3 1998/10/03 12:30:38 tsubai Exp $ */
|
||||
|
||||
#include <machine/asm.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/syscall.h>
|
||||
|
||||
/*
|
||||
* C library -- setjmp, longjmp
|
||||
*
|
||||
* longjmp(a,v)
|
||||
* will generate a "return(v?v:1)" from the last call to
|
||||
* setjmp(a)
|
||||
* by restoring registers from the stack.
|
||||
* The previous signal state is restored.
|
||||
*
|
||||
* jmpbuf layout:
|
||||
* +------------+
|
||||
* | unused |
|
||||
* +------------+
|
||||
* | sig state |
|
||||
* | |
|
||||
* | (4 words) |
|
||||
* | |
|
||||
* +------------+
|
||||
* | saved regs |
|
||||
* | ... |
|
||||
*/
|
||||
|
||||
ENTRY(setjmp)
|
||||
mr %r6,%r3
|
||||
li %r3,1 /* SIG_BLOCK, but doesn't matter */
|
||||
/* since set == NULL */
|
||||
li %r4,0 /* set = NULL */
|
||||
mr %r5,%r6 /* &oset */
|
||||
addi %r5,%r5,4
|
||||
li %r0, SYS_sigprocmask /*sigprocmask(SIG_BLOCK, NULL, &oset)*/
|
||||
sc /*assume no error XXX */
|
||||
mflr %r11 /* r11 <- link reg */
|
||||
mfcr %r12 /* r12 <- condition reg */
|
||||
mr %r10,%r1 /* r10 <- stackptr */
|
||||
mr %r9,%r2 /* r9 <- global ptr */
|
||||
evstdd %r9,24+0*8(%r6)
|
||||
evstdd %r10,24+1*8(%r6)
|
||||
evstdd %r11,24+2*8(%r6)
|
||||
evstdd %r12,24+3*8(%r6)
|
||||
evstdd %r13,24+4*8(%r6)
|
||||
evstdd %r14,24+5*8(%r6)
|
||||
evstdd %r15,24+6*8(%r6)
|
||||
evstdd %r16,24+7*8(%r6)
|
||||
evstdd %r17,24+8*8(%r6)
|
||||
evstdd %r18,24+9*8(%r6)
|
||||
evstdd %r19,24+10*8(%r6)
|
||||
evstdd %r20,24+11*8(%r6)
|
||||
evstdd %r21,24+12*8(%r6)
|
||||
evstdd %r22,24+13*8(%r6)
|
||||
evstdd %r23,24+14*8(%r6)
|
||||
evstdd %r24,24+15*8(%r6)
|
||||
evstdd %r25,24+16*8(%r6)
|
||||
evstdd %r26,24+17*8(%r6)
|
||||
evstdd %r27,24+18*8(%r6)
|
||||
evstdd %r28,24+19*8(%r6)
|
||||
evstdd %r29,24+20*8(%r6)
|
||||
evstdd %r30,24+21*8(%r6)
|
||||
evstdd %r31,24+22*8(%r6)
|
||||
|
||||
li %r3,0 /* return (0) */
|
||||
blr
|
||||
END(setjmp)
|
||||
|
||||
WEAK_REFERENCE(CNAME(__longjmp), longjmp)
|
||||
ENTRY(__longjmp)
|
||||
evldd %r9,24+0*8(%r3)
|
||||
evldd %r10,24+1*8(%r3)
|
||||
evldd %r11,24+2*8(%r3)
|
||||
evldd %r12,24+3*8(%r3)
|
||||
evldd %r13,24+4*8(%r3)
|
||||
evldd %r14,24+5*8(%r3)
|
||||
evldd %r15,24+6*8(%r3)
|
||||
evldd %r16,24+7*8(%r3)
|
||||
evldd %r17,24+8*8(%r3)
|
||||
evldd %r18,24+9*8(%r3)
|
||||
evldd %r19,24+10*8(%r3)
|
||||
evldd %r20,24+11*8(%r3)
|
||||
evldd %r21,24+12*8(%r3)
|
||||
evldd %r22,24+13*8(%r3)
|
||||
evldd %r23,24+14*8(%r3)
|
||||
evldd %r24,24+15*8(%r3)
|
||||
evldd %r25,24+16*8(%r3)
|
||||
evldd %r26,24+17*8(%r3)
|
||||
evldd %r27,24+18*8(%r3)
|
||||
evldd %r28,24+19*8(%r3)
|
||||
evldd %r29,24+20*8(%r3)
|
||||
evldd %r30,24+21*8(%r3)
|
||||
evldd %r31,24+22*8(%r3)
|
||||
|
||||
mr %r6,%r4 /* save val param */
|
||||
mtlr %r11 /* r11 -> link reg */
|
||||
mtcr %r12 /* r12 -> condition reg */
|
||||
mr %r1,%r10 /* r10 -> stackptr */
|
||||
mr %r4,%r3
|
||||
li %r3,3 /* SIG_SETMASK */
|
||||
addi %r4,%r4,4 /* &set */
|
||||
li %r5,0 /* oset = NULL */
|
||||
li %r0,SYS_sigprocmask /* sigprocmask(SIG_SET, &set, NULL) */
|
||||
sc /* assume no error XXX */
|
||||
or. %r3,%r6,%r6
|
||||
bnelr
|
||||
li %r3,1
|
||||
blr
|
||||
END(__longjmp)
|
||||
|
||||
.section .note.GNU-stack,"",%progbits
|
150
lib/libc/powerpcspe/gen/sigsetjmp.S
Normal file
150
lib/libc/powerpcspe/gen/sigsetjmp.S
Normal file
@ -0,0 +1,150 @@
|
||||
/*-
|
||||
* Copyright (c) 2016 Justin Hibbits
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
/* $NetBSD: sigsetjmp.S,v 1.4 1998/10/03 12:30:38 tsubai Exp $ */
|
||||
|
||||
#include <machine/asm.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
/*
|
||||
* C library -- sigsetjmp, siglongjmp
|
||||
*
|
||||
* siglongjmp(a,v)
|
||||
* will generate a "return(v?v:1)" from the last call to
|
||||
* sigsetjmp(a, savemask)
|
||||
* by restoring registers from the stack.
|
||||
* The previous signal state is restored if savemask is non-zero
|
||||
*
|
||||
* jmpbuf layout:
|
||||
* +------------+
|
||||
* | savemask |
|
||||
* +------------+
|
||||
* | sig state |
|
||||
* | |
|
||||
* | (4 words) |
|
||||
* | |
|
||||
* +------------+
|
||||
* | saved regs |
|
||||
* | ... |
|
||||
*/
|
||||
|
||||
|
||||
#include <sys/syscall.h>
|
||||
|
||||
ENTRY(sigsetjmp)
|
||||
mr %r6,%r3
|
||||
stw %r4,0(%r3)
|
||||
or. %r7,%r4,%r4
|
||||
beq 1f
|
||||
li %r3,1 /* SIG_BLOCK, but doesn't matter */
|
||||
/* since set == NULL */
|
||||
li %r4,0 /* set = NULL */
|
||||
mr %r5,%r6 /* &oset */
|
||||
addi %r5,%r5,4
|
||||
li %r0, SYS_sigprocmask /* sigprocmask(SIG_BLOCK, NULL, &oset)*/
|
||||
sc /* assume no error XXX */
|
||||
1:
|
||||
mflr %r11
|
||||
mfcr %r12
|
||||
mr %r10,%r1
|
||||
mr %r9,%r2
|
||||
|
||||
/* FPRs */
|
||||
evstdd %r9,24+0*8(%r6)
|
||||
evstdd %r10,24+1*8(%r6)
|
||||
evstdd %r11,24+2*8(%r6)
|
||||
evstdd %r12,24+3*8(%r6)
|
||||
evstdd %r13,24+4*8(%r6)
|
||||
evstdd %r14,24+5*8(%r6)
|
||||
evstdd %r15,24+6*8(%r6)
|
||||
evstdd %r16,24+7*8(%r6)
|
||||
evstdd %r17,24+8*8(%r6)
|
||||
evstdd %r18,24+9*8(%r6)
|
||||
evstdd %r19,24+10*8(%r6)
|
||||
evstdd %r20,24+11*8(%r6)
|
||||
evstdd %r21,24+12*8(%r6)
|
||||
evstdd %r22,24+13*8(%r6)
|
||||
evstdd %r23,24+14*8(%r6)
|
||||
evstdd %r24,24+15*8(%r6)
|
||||
evstdd %r25,24+16*8(%r6)
|
||||
evstdd %r26,24+17*8(%r6)
|
||||
evstdd %r27,24+18*8(%r6)
|
||||
evstdd %r28,24+19*8(%r6)
|
||||
evstdd %r29,24+20*8(%r6)
|
||||
evstdd %r30,24+21*8(%r6)
|
||||
evstdd %r31,24+22*8(%r6)
|
||||
|
||||
li %r3,0
|
||||
blr
|
||||
END(sigsetjmp)
|
||||
|
||||
ENTRY(siglongjmp)
|
||||
|
||||
/* FPRs */
|
||||
evldd %r9,24+0*8(%r3)
|
||||
evldd %r10,24+1*8(%r3)
|
||||
evldd %r11,24+2*8(%r3)
|
||||
evldd %r12,24+3*8(%r3)
|
||||
evldd %r13,24+4*8(%r3)
|
||||
evldd %r14,24+5*8(%r3)
|
||||
evldd %r15,24+6*8(%r3)
|
||||
evldd %r16,24+7*8(%r3)
|
||||
evldd %r17,24+8*8(%r3)
|
||||
evldd %r18,24+9*8(%r3)
|
||||
evldd %r19,24+10*8(%r3)
|
||||
evldd %r20,24+11*8(%r3)
|
||||
evldd %r21,24+12*8(%r3)
|
||||
evldd %r22,24+13*8(%r3)
|
||||
evldd %r23,24+14*8(%r3)
|
||||
evldd %r24,24+15*8(%r3)
|
||||
evldd %r25,24+16*8(%r3)
|
||||
evldd %r26,24+17*8(%r3)
|
||||
evldd %r27,24+18*8(%r3)
|
||||
evldd %r28,24+19*8(%r3)
|
||||
evldd %r29,24+20*8(%r3)
|
||||
evldd %r30,24+21*8(%r3)
|
||||
evldd %r31,24+22*8(%r3)
|
||||
|
||||
lwz %r7,0(%r3)
|
||||
mr %r6,%r4
|
||||
mtlr %r11
|
||||
mtcr %r12
|
||||
mr %r1,%r10
|
||||
or. %r7,%r7,%r7
|
||||
beq 1f
|
||||
mr %r4,%r3
|
||||
li %r3,3 /* SIG_SETMASK */
|
||||
addi %r4,%r4,4 /* &set */
|
||||
li %r5,0 /* oset = NULL */
|
||||
li %r0,SYS_sigprocmask /* sigprocmask(SIG_SET, &set, NULL) */
|
||||
sc /* assume no error XXX */
|
||||
1:
|
||||
or. %r3,%r6,%r6
|
||||
bnelr
|
||||
li %r3,1
|
||||
blr
|
||||
END(siglongjmp)
|
||||
|
||||
.section .note.GNU-stack,"",%progbits
|
49
lib/libc/powerpcspe/softfloat/milieu.h
Normal file
49
lib/libc/powerpcspe/softfloat/milieu.h
Normal file
@ -0,0 +1,49 @@
|
||||
/* $NetBSD: milieu.h,v 1.1 2000/12/29 20:13:54 bjh21 Exp $ */
|
||||
/* $FreeBSD$ */
|
||||
|
||||
/*
|
||||
===============================================================================
|
||||
|
||||
This C header file is part of the SoftFloat IEC/IEEE Floating-point
|
||||
Arithmetic Package, Release 2a.
|
||||
|
||||
Written by John R. Hauser. This work was made possible in part by the
|
||||
International Computer Science Institute, located at Suite 600, 1947 Center
|
||||
Street, Berkeley, California 94704. Funding was partially provided by the
|
||||
National Science Foundation under grant MIP-9311980. The original version
|
||||
of this code was written as part of a project to build a fixed-point vector
|
||||
processor in collaboration with the University of California at Berkeley,
|
||||
overseen by Profs. Nelson Morgan and John Wawrzynek. More information
|
||||
is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
|
||||
arithmetic/SoftFloat.html'.
|
||||
|
||||
THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
|
||||
has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
|
||||
TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
|
||||
PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
|
||||
AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
|
||||
|
||||
Derivative works are acceptable, even for commercial purposes, so long as
|
||||
(1) they include prominent notice that the work is derivative, and (2) they
|
||||
include prominent notice akin to these four paragraphs for those parts of
|
||||
this code that are retained.
|
||||
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Include common integer types and flags.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#include "powerpc-gcc.h"
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Symbolic Boolean literals.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
enum {
|
||||
FALSE = 0,
|
||||
TRUE = 1
|
||||
};
|
92
lib/libc/powerpcspe/softfloat/powerpc-gcc.h
Normal file
92
lib/libc/powerpcspe/softfloat/powerpc-gcc.h
Normal file
@ -0,0 +1,92 @@
|
||||
/* $NetBSD: arm-gcc.h,v 1.2 2001/02/21 18:09:25 bjh21 Exp $ */
|
||||
/* $FreeBSD$ */
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
One of the macros `BIGENDIAN' or `LITTLEENDIAN' must be defined.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#define BIGENDIAN
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
The macro `BITS64' can be defined to indicate that 64-bit integer types are
|
||||
supported by the compiler.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#define BITS64
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Each of the following `typedef's defines the most convenient type that holds
|
||||
integers of at least as many bits as specified. For example, `uint8' should
|
||||
be the most convenient type that can hold unsigned integers of as many as
|
||||
8 bits. The `flag' type must be able to hold either a 0 or 1. For most
|
||||
implementations of C, `flag', `uint8', and `int8' should all be `typedef'ed
|
||||
to the same as `int'.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
typedef int flag;
|
||||
typedef unsigned int uint8;
|
||||
typedef int int8;
|
||||
typedef unsigned int uint16;
|
||||
typedef int int16;
|
||||
typedef unsigned int uint32;
|
||||
typedef signed int int32;
|
||||
#ifdef BITS64
|
||||
typedef unsigned long long int uint64;
|
||||
typedef signed long long int int64;
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Each of the following `typedef's defines a type that holds integers
|
||||
of _exactly_ the number of bits specified. For instance, for most
|
||||
implementation of C, `bits16' and `sbits16' should be `typedef'ed to
|
||||
`unsigned short int' and `signed short int' (or `short int'), respectively.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
typedef unsigned char bits8;
|
||||
typedef signed char sbits8;
|
||||
typedef unsigned short int bits16;
|
||||
typedef signed short int sbits16;
|
||||
typedef unsigned int bits32;
|
||||
typedef signed int sbits32;
|
||||
#ifdef BITS64
|
||||
typedef unsigned long long int bits64;
|
||||
typedef signed long long int sbits64;
|
||||
#endif
|
||||
|
||||
#ifdef BITS64
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
The `LIT64' macro takes as its argument a textual integer literal and
|
||||
if necessary ``marks'' the literal as having a 64-bit integer type.
|
||||
For example, the GNU C Compiler (`gcc') requires that 64-bit literals be
|
||||
appended with the letters `LL' standing for `long long', which is `gcc's
|
||||
name for the 64-bit integer type. Some compilers may allow `LIT64' to be
|
||||
defined as the identity macro: `#define LIT64( a ) a'.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#define LIT64( a ) a##LL
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
The macro `INLINE' can be used before functions that should be inlined. If
|
||||
a compiler does not support explicit inlining, this macro should be defined
|
||||
to be `static'.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#define INLINE static __inline
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
The ARM FPA is odd in that it stores doubles high-order word first, no matter
|
||||
what the endianness of the CPU. VFP is sane.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#if defined(SOFTFLOAT_FOR_GCC)
|
||||
#define FLOAT64_DEMANGLE(a) (a)
|
||||
#define FLOAT64_MANGLE(a) (a)
|
||||
#endif
|
307
lib/libc/powerpcspe/softfloat/softfloat.h
Normal file
307
lib/libc/powerpcspe/softfloat/softfloat.h
Normal file
@ -0,0 +1,307 @@
|
||||
/* $NetBSD: softfloat.h,v 1.6 2002/05/12 13:12:46 bjh21 Exp $ */
|
||||
/* $FreeBSD$ */
|
||||
|
||||
/* This is a derivative work. */
|
||||
|
||||
/*
|
||||
===============================================================================
|
||||
|
||||
This C header file is part of the SoftFloat IEC/IEEE Floating-point
|
||||
Arithmetic Package, Release 2a.
|
||||
|
||||
Written by John R. Hauser. This work was made possible in part by the
|
||||
International Computer Science Institute, located at Suite 600, 1947 Center
|
||||
Street, Berkeley, California 94704. Funding was partially provided by the
|
||||
National Science Foundation under grant MIP-9311980. The original version
|
||||
of this code was written as part of a project to build a fixed-point vector
|
||||
processor in collaboration with the University of California at Berkeley,
|
||||
overseen by Profs. Nelson Morgan and John Wawrzynek. More information
|
||||
is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
|
||||
arithmetic/SoftFloat.html'.
|
||||
|
||||
THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
|
||||
has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
|
||||
TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
|
||||
PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
|
||||
AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
|
||||
|
||||
Derivative works are acceptable, even for commercial purposes, so long as
|
||||
(1) they include prominent notice that the work is derivative, and (2) they
|
||||
include prominent notice akin to these four paragraphs for those parts of
|
||||
this code that are retained.
|
||||
|
||||
===============================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
The macro `FLOATX80' must be defined to enable the extended double-precision
|
||||
floating-point format `floatx80'. If this macro is not defined, the
|
||||
`floatx80' type will not be defined, and none of the functions that either
|
||||
input or output the `floatx80' type will be defined. The same applies to
|
||||
the `FLOAT128' macro and the quadruple-precision format `float128'.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
/* #define FLOATX80 */
|
||||
/* #define FLOAT128 */
|
||||
|
||||
#include <machine/ieeefp.h>
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE floating-point types.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
typedef unsigned int float32;
|
||||
typedef unsigned long long float64;
|
||||
#ifdef FLOATX80
|
||||
typedef struct {
|
||||
unsigned short high;
|
||||
unsigned long long low;
|
||||
} floatx80;
|
||||
#endif
|
||||
#ifdef FLOAT128
|
||||
typedef struct {
|
||||
unsigned long long high, low;
|
||||
} float128;
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE floating-point underflow tininess-detection mode.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef SOFTFLOAT_FOR_GCC
|
||||
extern int8 float_detect_tininess;
|
||||
#endif
|
||||
enum {
|
||||
float_tininess_after_rounding = 0,
|
||||
float_tininess_before_rounding = 1
|
||||
};
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE floating-point rounding mode.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
extern fp_rnd_t float_rounding_mode;
|
||||
enum {
|
||||
float_round_nearest_even = FP_RN,
|
||||
float_round_to_zero = FP_RZ,
|
||||
float_round_down = FP_RM,
|
||||
float_round_up = FP_RP
|
||||
};
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE floating-point exception flags.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
typedef fp_except_t fp_except;
|
||||
|
||||
extern fp_except float_exception_flags;
|
||||
extern fp_except float_exception_mask;
|
||||
enum {
|
||||
float_flag_inexact = FP_X_IMP,
|
||||
float_flag_underflow = FP_X_UFL,
|
||||
float_flag_overflow = FP_X_OFL,
|
||||
float_flag_divbyzero = FP_X_DZ,
|
||||
float_flag_invalid = FP_X_INV
|
||||
};
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Routine to raise any or all of the software IEC/IEEE floating-point
|
||||
exception flags.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
void float_raise( fp_except );
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE integer-to-floating-point conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
float32 int32_to_float32( int );
|
||||
float64 int32_to_float64( int );
|
||||
#ifdef FLOATX80
|
||||
floatx80 int32_to_floatx80( int );
|
||||
#endif
|
||||
#ifdef FLOAT128
|
||||
float128 int32_to_float128( int );
|
||||
#endif
|
||||
float32 int64_to_float32( long long );
|
||||
float64 int64_to_float64( long long );
|
||||
#ifdef FLOATX80
|
||||
floatx80 int64_to_floatx80( long long );
|
||||
#endif
|
||||
#ifdef FLOAT128
|
||||
float128 int64_to_float128( long long );
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE single-precision conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
int float32_to_int32( float32 );
|
||||
int float32_to_int32_round_to_zero( float32 );
|
||||
unsigned int float32_to_uint32_round_to_zero( float32 );
|
||||
long long float32_to_int64( float32 );
|
||||
long long float32_to_int64_round_to_zero( float32 );
|
||||
float64 float32_to_float64( float32 );
|
||||
#ifdef FLOATX80
|
||||
floatx80 float32_to_floatx80( float32 );
|
||||
#endif
|
||||
#ifdef FLOAT128
|
||||
float128 float32_to_float128( float32 );
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE single-precision operations.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
float32 float32_round_to_int( float32 );
|
||||
float32 float32_add( float32, float32 );
|
||||
float32 float32_sub( float32, float32 );
|
||||
float32 float32_mul( float32, float32 );
|
||||
float32 float32_div( float32, float32 );
|
||||
float32 float32_rem( float32, float32 );
|
||||
float32 float32_sqrt( float32 );
|
||||
int float32_eq( float32, float32 );
|
||||
int float32_le( float32, float32 );
|
||||
int float32_lt( float32, float32 );
|
||||
int float32_eq_signaling( float32, float32 );
|
||||
int float32_le_quiet( float32, float32 );
|
||||
int float32_lt_quiet( float32, float32 );
|
||||
#ifndef SOFTFLOAT_FOR_GCC
|
||||
int float32_is_signaling_nan( float32 );
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE double-precision conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
int float64_to_int32( float64 );
|
||||
int float64_to_int32_round_to_zero( float64 );
|
||||
unsigned int float64_to_uint32_round_to_zero( float64 );
|
||||
long long float64_to_int64( float64 );
|
||||
long long float64_to_int64_round_to_zero( float64 );
|
||||
float32 float64_to_float32( float64 );
|
||||
#ifdef FLOATX80
|
||||
floatx80 float64_to_floatx80( float64 );
|
||||
#endif
|
||||
#ifdef FLOAT128
|
||||
float128 float64_to_float128( float64 );
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE double-precision operations.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
float64 float64_round_to_int( float64 );
|
||||
float64 float64_add( float64, float64 );
|
||||
float64 float64_sub( float64, float64 );
|
||||
float64 float64_mul( float64, float64 );
|
||||
float64 float64_div( float64, float64 );
|
||||
float64 float64_rem( float64, float64 );
|
||||
float64 float64_sqrt( float64 );
|
||||
int float64_eq( float64, float64 );
|
||||
int float64_le( float64, float64 );
|
||||
int float64_lt( float64, float64 );
|
||||
int float64_eq_signaling( float64, float64 );
|
||||
int float64_le_quiet( float64, float64 );
|
||||
int float64_lt_quiet( float64, float64 );
|
||||
#ifndef SOFTFLOAT_FOR_GCC
|
||||
int float64_is_signaling_nan( float64 );
|
||||
#endif
|
||||
|
||||
#ifdef FLOATX80
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE extended double-precision conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
int floatx80_to_int32( floatx80 );
|
||||
int floatx80_to_int32_round_to_zero( floatx80 );
|
||||
long long floatx80_to_int64( floatx80 );
|
||||
long long floatx80_to_int64_round_to_zero( floatx80 );
|
||||
float32 floatx80_to_float32( floatx80 );
|
||||
float64 floatx80_to_float64( floatx80 );
|
||||
#ifdef FLOAT128
|
||||
float128 floatx80_to_float128( floatx80 );
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE extended double-precision rounding precision. Valid
|
||||
values are 32, 64, and 80.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
extern int floatx80_rounding_precision;
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE extended double-precision operations.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
floatx80 floatx80_round_to_int( floatx80 );
|
||||
floatx80 floatx80_add( floatx80, floatx80 );
|
||||
floatx80 floatx80_sub( floatx80, floatx80 );
|
||||
floatx80 floatx80_mul( floatx80, floatx80 );
|
||||
floatx80 floatx80_div( floatx80, floatx80 );
|
||||
floatx80 floatx80_rem( floatx80, floatx80 );
|
||||
floatx80 floatx80_sqrt( floatx80 );
|
||||
int floatx80_eq( floatx80, floatx80 );
|
||||
int floatx80_le( floatx80, floatx80 );
|
||||
int floatx80_lt( floatx80, floatx80 );
|
||||
int floatx80_eq_signaling( floatx80, floatx80 );
|
||||
int floatx80_le_quiet( floatx80, floatx80 );
|
||||
int floatx80_lt_quiet( floatx80, floatx80 );
|
||||
int floatx80_is_signaling_nan( floatx80 );
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef FLOAT128
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE quadruple-precision conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
int float128_to_int32( float128 );
|
||||
int float128_to_int32_round_to_zero( float128 );
|
||||
long long float128_to_int64( float128 );
|
||||
long long float128_to_int64_round_to_zero( float128 );
|
||||
float32 float128_to_float32( float128 );
|
||||
float64 float128_to_float64( float128 );
|
||||
#ifdef FLOATX80
|
||||
floatx80 float128_to_floatx80( float128 );
|
||||
#endif
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE quadruple-precision operations.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
float128 float128_round_to_int( float128 );
|
||||
float128 float128_add( float128, float128 );
|
||||
float128 float128_sub( float128, float128 );
|
||||
float128 float128_mul( float128, float128 );
|
||||
float128 float128_div( float128, float128 );
|
||||
float128 float128_rem( float128, float128 );
|
||||
float128 float128_sqrt( float128 );
|
||||
int float128_eq( float128, float128 );
|
||||
int float128_le( float128, float128 );
|
||||
int float128_lt( float128, float128 );
|
||||
int float128_eq_signaling( float128, float128 );
|
||||
int float128_le_quiet( float128, float128 );
|
||||
int float128_lt_quiet( float128, float128 );
|
||||
int float128_is_signaling_nan( float128 );
|
||||
|
||||
#endif
|
||||
|
4
lib/libc/powerpcspe/sys/Makefile.inc
Normal file
4
lib/libc/powerpcspe/sys/Makefile.inc
Normal file
@ -0,0 +1,4 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.PATH: ${LIBC_SRCTOP}/powerpc/sys
|
||||
.sinclude "${LIBC_SRCTOP}/powerpc/sys/Makefile.inc"
|
@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include "namespace.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
@ -55,6 +56,12 @@ __FBSDID("$FreeBSD$");
|
||||
#include "un-namespace.h"
|
||||
#include "printflocal.h"
|
||||
|
||||
#ifdef NL_ARGMAX
|
||||
#define MAX_POSARG NL_ARGMAX
|
||||
#else
|
||||
#define MAX_POSARG 65536
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Type ids for argument type table.
|
||||
*/
|
||||
@ -70,9 +77,9 @@ enum typeid {
|
||||
struct typetable {
|
||||
enum typeid *table; /* table of types */
|
||||
enum typeid stattable[STATIC_ARG_TBL_SIZE];
|
||||
int tablesize; /* current size of type table */
|
||||
int tablemax; /* largest used index in table */
|
||||
int nextarg; /* 1-based argument index */
|
||||
u_int tablesize; /* current size of type table */
|
||||
u_int tablemax; /* largest used index in table */
|
||||
u_int nextarg; /* 1-based argument index */
|
||||
};
|
||||
|
||||
static int __grow_type_table(struct typetable *);
|
||||
@ -84,7 +91,7 @@ static void build_arg_table (struct typetable *, va_list, union arg **);
|
||||
static inline void
|
||||
inittypes(struct typetable *types)
|
||||
{
|
||||
int n;
|
||||
u_int n;
|
||||
|
||||
types->table = types->stattable;
|
||||
types->tablesize = STATIC_ARG_TBL_SIZE;
|
||||
@ -185,7 +192,7 @@ static inline int
|
||||
addaster(struct typetable *types, char **fmtp)
|
||||
{
|
||||
char *cp;
|
||||
int n2;
|
||||
u_int n2;
|
||||
|
||||
n2 = 0;
|
||||
cp = *fmtp;
|
||||
@ -194,7 +201,7 @@ addaster(struct typetable *types, char **fmtp)
|
||||
cp++;
|
||||
}
|
||||
if (*cp == '$') {
|
||||
int hold = types->nextarg;
|
||||
u_int hold = types->nextarg;
|
||||
types->nextarg = n2;
|
||||
if (addtype(types, T_INT))
|
||||
return (-1);
|
||||
@ -211,7 +218,7 @@ static inline int
|
||||
addwaster(struct typetable *types, wchar_t **fmtp)
|
||||
{
|
||||
wchar_t *cp;
|
||||
int n2;
|
||||
u_int n2;
|
||||
|
||||
n2 = 0;
|
||||
cp = *fmtp;
|
||||
@ -220,7 +227,7 @@ addwaster(struct typetable *types, wchar_t **fmtp)
|
||||
cp++;
|
||||
}
|
||||
if (*cp == '$') {
|
||||
int hold = types->nextarg;
|
||||
u_int hold = types->nextarg;
|
||||
types->nextarg = n2;
|
||||
if (addtype(types, T_INT))
|
||||
return (-1);
|
||||
@ -245,7 +252,7 @@ __find_arguments (const char *fmt0, va_list ap, union arg **argtable)
|
||||
{
|
||||
char *fmt; /* format string */
|
||||
int ch; /* character from fmt */
|
||||
int n; /* handy integer (short term usage) */
|
||||
u_int n; /* handy integer (short term usage) */
|
||||
int error;
|
||||
int flags; /* flags as above */
|
||||
struct typetable types; /* table of types */
|
||||
@ -296,6 +303,11 @@ reswitch: switch (ch) {
|
||||
n = 0;
|
||||
do {
|
||||
n = 10 * n + to_digit(ch);
|
||||
/* Detect overflow */
|
||||
if (n > MAX_POSARG) {
|
||||
error = -1;
|
||||
goto error;
|
||||
}
|
||||
ch = *fmt++;
|
||||
} while (is_digit(ch));
|
||||
if (ch == '$') {
|
||||
@ -433,7 +445,7 @@ __find_warguments (const wchar_t *fmt0, va_list ap, union arg **argtable)
|
||||
{
|
||||
wchar_t *fmt; /* format string */
|
||||
wchar_t ch; /* character from fmt */
|
||||
int n; /* handy integer (short term usage) */
|
||||
u_int n; /* handy integer (short term usage) */
|
||||
int error;
|
||||
int flags; /* flags as above */
|
||||
struct typetable types; /* table of types */
|
||||
@ -484,6 +496,11 @@ reswitch: switch (ch) {
|
||||
n = 0;
|
||||
do {
|
||||
n = 10 * n + to_digit(ch);
|
||||
/* Detect overflow */
|
||||
if (n > MAX_POSARG) {
|
||||
error = -1;
|
||||
goto error;
|
||||
}
|
||||
ch = *fmt++;
|
||||
} while (is_digit(ch));
|
||||
if (ch == '$') {
|
||||
@ -624,7 +641,11 @@ __grow_type_table(struct typetable *types)
|
||||
enum typeid *const oldtable = types->table;
|
||||
const int oldsize = types->tablesize;
|
||||
enum typeid *newtable;
|
||||
int n, newsize = oldsize * 2;
|
||||
u_int n, newsize = oldsize * 2;
|
||||
|
||||
/* Detect overflow */
|
||||
if (types->nextarg > NL_ARGMAX)
|
||||
return (-1);
|
||||
|
||||
if (newsize < types->nextarg + 1)
|
||||
newsize = types->nextarg + 1;
|
||||
@ -653,7 +674,7 @@ __grow_type_table(struct typetable *types)
|
||||
static void
|
||||
build_arg_table(struct typetable *types, va_list ap, union arg **argtable)
|
||||
{
|
||||
int n;
|
||||
u_int n;
|
||||
|
||||
if (types->tablemax >= STATIC_ARG_TBL_SIZE) {
|
||||
*argtable = (union arg *)
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd October 5, 2016
|
||||
.Dd October 21, 2016
|
||||
.Dt CAPSICUM_HELPERS 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -57,7 +57,8 @@
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm capsicum helpers
|
||||
are a set of a inline functions which simplify Capsicumizing programs.
|
||||
are a set of a inline functions which simplify modifying programs to use
|
||||
Capsicum.
|
||||
The goal is to reduce duplicated code patterns.
|
||||
The
|
||||
.Nm capsicum helpers
|
||||
@ -70,7 +71,7 @@ restricts capabilities on
|
||||
.Fa fd
|
||||
to only those needed by POSIX stream objects (that is, FILEs).
|
||||
.Pp
|
||||
The following flags can be provided:
|
||||
These flags can be provided:
|
||||
.Pp
|
||||
.Bl -tag -width "CAPH_IGNORE_EBADF" -compact -offset indent
|
||||
.It Dv CAPH_IGNORE_EBADF
|
||||
|
@ -1,12 +1,13 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SHLIBDIR?= /lib/casper
|
||||
|
||||
.include <src.opts.mk>
|
||||
|
||||
PACKAGE=libcasper
|
||||
LIB= cap_dns
|
||||
|
||||
SHLIB_MAJOR= 0
|
||||
SHLIBDIR?= /lib/casper
|
||||
INCSDIR?= ${INCLUDEDIR}/casper
|
||||
|
||||
SRCS= cap_dns.c
|
||||
|
@ -1,12 +1,13 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SHLIBDIR?= /lib/casper
|
||||
|
||||
.include <src.opts.mk>
|
||||
|
||||
PACKAGE=libcasper
|
||||
LIB= cap_grp
|
||||
|
||||
SHLIB_MAJOR= 0
|
||||
SHLIBDIR?= /lib/casper
|
||||
INCSDIR?= ${INCLUDEDIR}/casper
|
||||
|
||||
SRCS= cap_grp.c
|
||||
|
@ -1,12 +1,13 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SHLIBDIR?= /lib/casper
|
||||
|
||||
.include <src.opts.mk>
|
||||
|
||||
PACKAGE=libcasper
|
||||
LIB= cap_pwd
|
||||
|
||||
SHLIB_MAJOR= 0
|
||||
SHLIBDIR?= /lib/casper
|
||||
INCSDIR?= ${INCLUDEDIR}/casper
|
||||
|
||||
SRCS= cap_pwd.c
|
||||
|
@ -1,12 +1,13 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SHLIBDIR?= /lib/casper
|
||||
|
||||
.include <src.opts.mk>
|
||||
|
||||
PACKAGE=libcasper
|
||||
LIB= cap_sysctl
|
||||
|
||||
SHLIB_MAJOR= 0
|
||||
SHLIBDIR?= /lib/casper
|
||||
INCSDIR?= ${INCLUDEDIR}/casper
|
||||
|
||||
SRCS= cap_sysctl.c
|
||||
|
@ -4,19 +4,24 @@ COMPILERRTDIR= ${SRCTOP}/contrib/compiler-rt
|
||||
UNWINDINCDIR= ${SRCTOP}/contrib/llvm/projects/libunwind/include
|
||||
UNWINDSRCDIR= ${SRCTOP}/contrib/llvm/projects/libunwind/src
|
||||
|
||||
CFLAGS+=${PICFLAG} -fvisibility=hidden -DVISIBILITY_HIDDEN
|
||||
STATIC_CFLAGS+=${PICFLAG} -fvisibility=hidden -DVISIBILITY_HIDDEN
|
||||
|
||||
.PATH: ${COMPILERRTDIR}/lib/builtins
|
||||
.PATH: ${UNWINDSRCDIR}
|
||||
SRCS+= gcc_personality_v0.c
|
||||
SRCS+= int_util.c
|
||||
SRCS+= Unwind-EHABI.cpp
|
||||
SRCS+= Unwind-sjlj.c
|
||||
SRCS+= UnwindLevel1-gcc-ext.c
|
||||
SRCS+= UnwindLevel1.c
|
||||
SRCS+= UnwindRegistersRestore.S
|
||||
SRCS+= UnwindRegistersSave.S
|
||||
SRCS+= libunwind.cpp
|
||||
SRCS_EXC+= gcc_personality_v0.c
|
||||
SRCS_EXC+= int_util.c
|
||||
SRCS_EXC+= Unwind-EHABI.cpp
|
||||
SRCS_EXC+= Unwind-sjlj.c
|
||||
SRCS_EXC+= UnwindLevel1-gcc-ext.c
|
||||
SRCS_EXC+= UnwindLevel1.c
|
||||
SRCS_EXC+= UnwindRegistersRestore.S
|
||||
SRCS_EXC+= UnwindRegistersSave.S
|
||||
SRCS_EXC+= libunwind.cpp
|
||||
|
||||
SRCS+= ${SRCS_EXC}
|
||||
.for file in ${SRCS_EXC:M*.c}
|
||||
CFLAGS.${file}+= -fexceptions
|
||||
.endfor
|
||||
|
||||
CFLAGS+= -I${UNWINDINCDIR} -I${.CURDIR} -D_LIBUNWIND_IS_NATIVE_ONLY
|
||||
.if empty(CXXFLAGS:M-std=*)
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
PKG= clibs
|
||||
SHLIB_NAME= libgcc_s.so.1
|
||||
SHLIBDIR?= /lib
|
||||
|
||||
WARNS?= 2
|
||||
|
||||
|
@ -35,11 +35,13 @@
|
||||
|
||||
#include_next <sys/cdefs.h>
|
||||
|
||||
#ifndef __dead
|
||||
#ifdef __dead2
|
||||
#define __dead __dead2
|
||||
#else
|
||||
#define __dead
|
||||
#endif
|
||||
#endif /* !__dead */
|
||||
|
||||
/*
|
||||
* The __CONCAT macro is used to concatenate parts of symbol names, e.g.
|
||||
|
@ -36,7 +36,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <util.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
char *
|
||||
flags_to_string(u_long flags, const char *def)
|
||||
|
@ -68,6 +68,14 @@ __FBSDID("$FreeBSD$");
|
||||
#error "Add support for your architecture"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Use 4-bytes holder for breakpoint instruction on all the platforms.
|
||||
* Works for x86 as well until it is endian-little platform.
|
||||
* (We are coping one byte only on x86 from this 4-bytes piece of
|
||||
* memory).
|
||||
*/
|
||||
typedef uint32_t instr_t;
|
||||
|
||||
static int
|
||||
proc_stop(struct proc_handle *phdl)
|
||||
{
|
||||
@ -92,8 +100,9 @@ proc_bkptset(struct proc_handle *phdl, uintptr_t address,
|
||||
unsigned long *saved)
|
||||
{
|
||||
struct ptrace_io_desc piod;
|
||||
unsigned long paddr, caddr;
|
||||
unsigned long caddr;
|
||||
int ret = 0, stopped;
|
||||
instr_t instr;
|
||||
|
||||
*saved = 0;
|
||||
if (phdl->status == PS_DEAD || phdl->status == PS_UNDEAD ||
|
||||
@ -115,10 +124,10 @@ proc_bkptset(struct proc_handle *phdl, uintptr_t address,
|
||||
* Read the original instruction.
|
||||
*/
|
||||
caddr = address;
|
||||
paddr = 0;
|
||||
instr = 0;
|
||||
piod.piod_op = PIOD_READ_I;
|
||||
piod.piod_offs = (void *)caddr;
|
||||
piod.piod_addr = &paddr;
|
||||
piod.piod_addr = &instr;
|
||||
piod.piod_len = BREAKPOINT_INSTR_SZ;
|
||||
if (ptrace(PT_IO, proc_getpid(phdl), (caddr_t)&piod, 0) < 0) {
|
||||
DPRINTF("ERROR: couldn't read instruction at address 0x%"
|
||||
@ -126,15 +135,15 @@ proc_bkptset(struct proc_handle *phdl, uintptr_t address,
|
||||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
*saved = paddr;
|
||||
*saved = instr;
|
||||
/*
|
||||
* Write a breakpoint instruction to that address.
|
||||
*/
|
||||
caddr = address;
|
||||
paddr = BREAKPOINT_INSTR;
|
||||
instr = BREAKPOINT_INSTR;
|
||||
piod.piod_op = PIOD_WRITE_I;
|
||||
piod.piod_offs = (void *)caddr;
|
||||
piod.piod_addr = &paddr;
|
||||
piod.piod_addr = &instr;
|
||||
piod.piod_len = BREAKPOINT_INSTR_SZ;
|
||||
if (ptrace(PT_IO, proc_getpid(phdl), (caddr_t)&piod, 0) < 0) {
|
||||
DPRINTF("ERROR: couldn't write instruction at address 0x%"
|
||||
@ -156,8 +165,9 @@ proc_bkptdel(struct proc_handle *phdl, uintptr_t address,
|
||||
unsigned long saved)
|
||||
{
|
||||
struct ptrace_io_desc piod;
|
||||
unsigned long paddr, caddr;
|
||||
unsigned long caddr;
|
||||
int ret = 0, stopped;
|
||||
instr_t instr;
|
||||
|
||||
if (phdl->status == PS_DEAD || phdl->status == PS_UNDEAD ||
|
||||
phdl->status == PS_IDLE) {
|
||||
@ -178,10 +188,10 @@ proc_bkptdel(struct proc_handle *phdl, uintptr_t address,
|
||||
* Overwrite the breakpoint instruction that we setup previously.
|
||||
*/
|
||||
caddr = address;
|
||||
paddr = saved;
|
||||
instr = saved;
|
||||
piod.piod_op = PIOD_WRITE_I;
|
||||
piod.piod_offs = (void *)caddr;
|
||||
piod.piod_addr = &paddr;
|
||||
piod.piod_addr = &instr;
|
||||
piod.piod_len = BREAKPOINT_INSTR_SZ;
|
||||
if (ptrace(PT_IO, proc_getpid(phdl), (caddr_t)&piod, 0) < 0) {
|
||||
DPRINTF("ERROR: couldn't write instruction at address 0x%"
|
||||
|
@ -5,6 +5,7 @@ SHLIBDIR?= /lib
|
||||
|
||||
.include <src.opts.mk>
|
||||
|
||||
INCS= librss.h
|
||||
LIB= rss
|
||||
SHLIB_MAJOR= 1
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user