Merge ^/head r340213 through r340234.

This commit is contained in:
Dimitry Andric 2018-11-07 18:54:24 +00:00
commit 8c1538224a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/clang700-import/; revision=340235
19 changed files with 142 additions and 94 deletions

View File

@ -27,5 +27,25 @@
#define _CRT_H_
#define HAVE_CTORS
#define CTORS_CONSTRUCTORS
#ifdef __mips_o32
#define INIT_CALL_SEQ(func) \
".set noreorder \n" \
"bal 1f \n" \
"nop \n" \
"1: \n" \
".cpload $ra \n" \
".set reorder \n" \
"jal " __STRING(func)
#else
#define INIT_CALL_SEQ(func) \
".set noreorder \n" \
"bal 1f \n" \
"nop \n" \
"1: \n" \
".set reorder \n" \
".cpsetup $ra, $v0, 1b \n" \
"jal " __STRING(func)
#endif
#endif

View File

@ -27,5 +27,7 @@
#define _CRT_H_
#define HAVE_CTORS
#define CTORS_CONSTRUCTORS
#define INIT_CALL_SEQ(func) "call " __STRING(func) "; nop"
#endif

View File

@ -1264,6 +1264,13 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
*((Elf_Addr *)(dynp->d_un.d_ptr)) = (Elf_Addr) &r_debug;
break;
case DT_MIPS_RLD_MAP_REL:
// The MIPS_RLD_MAP_REL tag stores the offset to the .rld_map
// section relative to the address of the tag itself.
*((Elf_Addr *)(__DECONST(char*, dynp) + dynp->d_un.d_val)) =
(Elf_Addr) &r_debug;
break;
case DT_MIPS_PLTGOT:
obj->mips_pltgot = (Elf_Addr *)(obj->relocbase +
dynp->d_un.d_ptr);

View File

@ -29,7 +29,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd June 19, 2018
.Dd November 7, 2018
.Dt RC.SUBR 8
.Os
.Sh NAME
@ -491,16 +491,22 @@ Check for the existence of the listed directories
before running the
.Cm start
method.
The list is checked before running
.Va start_precmd .
.It Va required_files
Check for the readability of the listed files
before running the
.Cm start
method.
The list is checked before running
.Va start_precmd .
.It Va required_modules
Ensure that the listed kernel modules are loaded
before running the
.Cm start
method.
The list is checked after running
.Va start_precmd .
This is done after invoking the commands from
.Va start_precmd
so that the missing modules are not loaded in vain
@ -531,6 +537,8 @@ on each of the list variables
before running the
.Cm start
method.
The list is checked after running
.Va start_precmd .
.It Va ${name}_chdir
Directory to
.Ic cd

View File

@ -193,6 +193,7 @@ __DEFAULT_YES_OPTIONS = \
ZONEINFO
__DEFAULT_NO_OPTIONS = \
BSD_CRTBEGIN \
BSD_GREP \
CLANG_EXTRAS \
DTRACE_TESTS \
@ -385,13 +386,6 @@ BROKEN_OPTIONS+=HYPERV
BROKEN_OPTIONS+=NVME
.endif
.if ${__T} == "aarch64" || ${__T} == "amd64" || ${__T} == "i386" || \
${__T} == "powerpc64"
__DEFAULT_NO_OPTIONS+=BSD_CRTBEGIN
.else
BROKEN_OPTIONS+=BSD_CRTBEGIN
.endif
.include <bsd.mkopt.mk>
#

View File

@ -265,9 +265,7 @@ disk_open(struct disk_devdesc *dev, uint64_t mediasize, u_int sectorsize)
rc = ENXIO;
goto out;
}
if (mediasize > od->mediasize) {
od->mediasize = mediasize;
}
od->mediasize = mediasize;
if (ptable_gettype(od->table) == PTABLE_BSD &&
partition >= 0) {

View File

@ -323,8 +323,7 @@ ptable_gptread(struct ptable *table, void *dev, diskread_t dread)
* Note, this is still not a foolproof way to get disk's size. For
* example, an image file can be truncated when copied to smaller media.
*/
if (hdr.hdr_lba_alt + 1 > table->sectors)
table->sectors = hdr.hdr_lba_alt + 1;
table->sectors = hdr.hdr_lba_alt + 1;
for (i = 0; i < size / hdr.hdr_entsz; i++) {
ent = (struct gpt_ent *)(tbl + i * hdr.hdr_entsz);

View File

@ -438,6 +438,33 @@ bd_print(int verbose)
return (ret);
}
/*
* Read disk size from partition.
* This is needed to work around buggy BIOS systems returning
* wrong (truncated) disk media size.
* During bd_probe() we tested if the multiplication of bd_sectors
* would overflow so it should be safe to perform here.
*/
static uint64_t
bd_disk_get_sectors(struct disk_devdesc *dev)
{
struct disk_devdesc disk;
uint64_t size;
disk.dd.d_dev = dev->dd.d_dev;
disk.dd.d_unit = dev->dd.d_unit;
disk.d_slice = -1;
disk.d_partition = -1;
disk.d_offset = 0;
size = BD(dev).bd_sectors * BD(dev).bd_sectorsize;
if (disk_open(&disk, size, BD(dev).bd_sectorsize) == 0) {
(void) disk_ioctl(&disk, DIOCGMEDIASIZE, &size);
disk_close(&disk);
}
return (size / BD(dev).bd_sectorsize);
}
/*
* Attempt to open the disk described by (dev) for use by (f).
*
@ -452,9 +479,7 @@ static int
bd_open(struct open_file *f, ...)
{
struct disk_devdesc *dev;
struct disk_devdesc disk;
va_list ap;
uint64_t size;
int rc;
va_start(ap, f);
@ -470,33 +495,12 @@ bd_open(struct open_file *f, ...)
if ((BD(dev).bd_flags & BD_NO_MEDIA) == BD_NO_MEDIA)
return (EIO);
}
BD(dev).bd_open++;
if (BD(dev).bd_bcache == NULL)
BD(dev).bd_bcache = bcache_allocate();
/*
* Read disk size from partition.
* This is needed to work around buggy BIOS systems returning
* wrong (truncated) disk media size.
* During bd_probe() we tested if the mulitplication of bd_sectors
* would overflow so it should be safe to perform here.
*/
disk.dd.d_dev = dev->dd.d_dev;
disk.dd.d_unit = dev->dd.d_unit;
disk.d_slice = -1;
disk.d_partition = -1;
disk.d_offset = 0;
if (disk_open(&disk, BD(dev).bd_sectors * BD(dev).bd_sectorsize,
BD(dev).bd_sectorsize) == 0) {
if (disk_ioctl(&disk, DIOCGMEDIASIZE, &size) == 0) {
size /= BD(dev).bd_sectorsize;
if (size > BD(dev).bd_sectors)
BD(dev).bd_sectors = size;
}
disk_close(&disk);
}
if (BD(dev).bd_open == 0)
BD(dev).bd_sectors = bd_disk_get_sectors(dev);
BD(dev).bd_open++;
rc = disk_open(dev, BD(dev).bd_sectors * BD(dev).bd_sectorsize,
BD(dev).bd_sectorsize);

View File

@ -107,21 +107,6 @@ static Elf64_Brandinfo freebsd_brand_info = {
SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST,
(sysinit_cfunc_t)elf64_insert_brand_entry, &freebsd_brand_info);
static Elf64_Brandinfo freebsd_brand_oinfo = {
.brand = ELFOSABI_FREEBSD,
.machine = EM_AARCH64,
.compat_3_brand = "FreeBSD",
.emul_path = NULL,
.interp_path = "/usr/libexec/ld-elf.so.1",
.sysvec = &elf64_freebsd_sysvec,
.interp_newpath = NULL,
.brand_note = &elf64_freebsd_brandnote,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
};
SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_ANY,
(sysinit_cfunc_t)elf64_insert_brand_entry, &freebsd_brand_oinfo);
void
elf64_dump_thread(struct thread *td __unused, void *dst __unused,
size_t *off __unused)

View File

@ -8839,7 +8839,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
/* break */
case 17:
if (ndx == 0 || ndx == 1)
p = "caddr_t";
p = "void *";
break;
/* getpid */
case 20:
@ -9388,7 +9388,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
/* shmat */
case 228:
if (ndx == 0 || ndx == 1)
p = "int";
p = "void *";
break;
/* shmdt */
case 230:
@ -10139,7 +10139,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
/* freebsd32_mmap */
case 477:
if (ndx == 0 || ndx == 1)
p = "caddr_t";
p = "void *";
break;
/* freebsd32_lseek */
case 478:
@ -10170,7 +10170,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
/* freebsd32_mmap */
case 477:
if (ndx == 0 || ndx == 1)
p = "caddr_t";
p = "void *";
break;
/* freebsd32_lseek */
case 478:

View File

@ -88,7 +88,7 @@
int mode, int dev); }
15 AUE_CHMOD NOPROTO { int chmod(const char *path, mode_t mode); }
16 AUE_CHOWN NOPROTO { int chown(const char *path, int uid, int gid); }
17 AUE_NULL NOPROTO { caddr_t break(char *nsize); }
17 AUE_NULL NOPROTO { void *break(char *nsize); }
18 AUE_GETFSSTAT COMPAT4 { int freebsd32_getfsstat( \
struct statfs32 *buf, long bufsize, \
int mode); }
@ -175,7 +175,7 @@
68 AUE_NULL OBSOL vwrite
69 AUE_SBRK NOPROTO { int sbrk(int incr); }
70 AUE_SSTK NOPROTO { int sstk(int incr); }
71 AUE_MMAP COMPAT|NOPROTO { int mmap(void *addr, int len, \
71 AUE_MMAP COMPAT|NOPROTO { void *mmap(void *addr, int len, \
int prot, int flags, int fd, int pos); }
72 AUE_O_VADVISE COMPAT11|NOPROTO { int vadvise(int anom); }
73 AUE_MUNMAP NOPROTO { int munmap(void *addr, size_t len); }
@ -373,7 +373,7 @@
__setrlimit_args int
196 AUE_GETDIRENTRIES COMPAT11 { int freebsd32_getdirentries(int fd, \
char *buf, u_int count, int32_t *basep); }
197 AUE_MMAP COMPAT6 { caddr_t freebsd32_mmap(void *addr, \
197 AUE_MMAP COMPAT6 { void *freebsd32_mmap(void *addr, \
size_t len, int prot, int flags, int fd, \
int pad, uint32_t pos1, uint32_t pos2); }
198 AUE_NULL NOPROTO { int nosys(void); } __syscall \
@ -432,7 +432,7 @@
size_t msgsz, int msgflg); }
227 AUE_MSGRCV NOSTD { int freebsd32_msgrcv(int msqid, void *msgp, \
size_t msgsz, long msgtyp, int msgflg); }
228 AUE_SHMAT NOSTD|NOPROTO { int shmat(int shmid, void *shmaddr, \
228 AUE_SHMAT NOSTD|NOPROTO { void *shmat(int shmid, void *shmaddr, \
int shmflg); }
229 AUE_SHMCTL COMPAT7|NOSTD { int freebsd32_shmctl( \
int shmid, int cmd, \
@ -876,7 +876,7 @@
const void *buf, size_t nbyte, \
int pad, \
uint32_t offset1, uint32_t offset2); }
477 AUE_MMAP STD { caddr_t freebsd32_mmap(void *addr, \
477 AUE_MMAP STD { void *freebsd32_mmap(void *addr, \
size_t len, int prot, int flags, int fd, \
int pad, \
uint32_t pos1, uint32_t pos2); }
@ -897,7 +897,7 @@
476 AUE_PWRITE STD { ssize_t freebsd32_pwrite(int fd, \
const void *buf, size_t nbyte, \
uint32_t offset1, uint32_t offset2); }
477 AUE_MMAP STD { caddr_t freebsd32_mmap(void *addr, \
477 AUE_MMAP STD { void *freebsd32_mmap(void *addr, \
size_t len, int prot, int flags, int fd, \
uint32_t pos1, uint32_t pos2); }
478 AUE_LSEEK STD { off_t freebsd32_lseek(int fd, \

View File

@ -420,8 +420,6 @@ g_io_check(struct bio *bp)
return (EIO);
if (bp->bio_offset > pp->mediasize)
return (EIO);
if (bp->bio_offset == pp->mediasize && bp->bio_length > 0)
return (EIO);
/* Truncate requests to the end of providers media. */
excess = bp->bio_offset + bp->bio_length;

View File

@ -120,7 +120,8 @@ SYSCTL_INT(_debug, OID_AUTO, __elfN(legacy_coredump), CTLFLAG_RW,
int __elfN(nxstack) =
#if defined(__amd64__) || defined(__powerpc64__) /* both 64 and 32 bit */ || \
(defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__)
(defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__) || \
defined(__riscv)
1;
#else
0;

View File

@ -325,6 +325,7 @@ sed -e '
}
function parseline() {
f=4 # toss number, type, audit event
ret_inc = 0
argc= 0;
argssize = "0"
thr_flag = "SY_THR_STATIC"
@ -340,12 +341,15 @@ sed -e '
funcalias=""
argalias=""
rettype="int"
if ($(f+2) == "*") {
ret_inc = 1
}
end=NF
}
if (flag("NODEF")) {
auditev="AUE_NULL"
funcname=$4
argssize = "AS(" $6 ")"
funcname=$(4 + ret_inc)
argssize = "AS(" $(6 + ret_inc) ")"
return
}
if ($f != "{")
@ -363,6 +367,11 @@ sed -e '
syscallret=$f
f++
while (ret_inc > 0) {
syscallret=syscallret " " $f
f++
ret_inc--
}
funcname=$f

View File

@ -180,7 +180,7 @@
);
}
17 AUE_NULL STD {
caddr_t break(
void *break(
_In_ char *nsize
);
}
@ -480,7 +480,7 @@
);
}
71 AUE_MMAP COMPAT {
int mmap(
void *mmap(
_In_ void *addr,
int len,
int prot,
@ -1168,7 +1168,7 @@
);
}
197 AUE_MMAP COMPAT6 {
caddr_t mmap(
void *mmap(
_In_ void *addr,
size_t len,
int prot,
@ -1317,7 +1317,7 @@
);
}
228 AUE_SHMAT NOSTD {
int shmat(
void *shmat(
int shmid,
_In_ const void *shmaddr,
int shmflg
@ -2543,7 +2543,7 @@
);
}
477 AUE_MMAP STD {
caddr_t mmap(
void *mmap(
_In_ void *addr,
size_t len,
int prot,

View File

@ -8788,7 +8788,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
/* break */
case 17:
if (ndx == 0 || ndx == 1)
p = "caddr_t";
p = "void *";
break;
/* getpid */
case 20:
@ -9357,7 +9357,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
/* shmat */
case 228:
if (ndx == 0 || ndx == 1)
p = "int";
p = "void *";
break;
/* shmdt */
case 230:
@ -10187,7 +10187,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
/* mmap */
case 477:
if (ndx == 0 || ndx == 1)
p = "caddr_t";
p = "void *";
break;
/* lseek */
case 478:

View File

@ -83,10 +83,12 @@ struct sysentvec elf64_freebsd_sysvec = {
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_LP64,
.sv_flags = SV_ABI_FREEBSD | SV_LP64 | SV_SHP,
.sv_set_syscall_retval = cpu_set_syscall_retval,
.sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = syscallnames,
.sv_shared_page_base = SHAREDPAGE,
.sv_shared_page_len = PAGE_SIZE,
.sv_schedtail = NULL,
.sv_thread_detach = NULL,
.sv_trap = NULL,
@ -109,22 +111,6 @@ SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST,
(sysinit_cfunc_t) elf64_insert_brand_entry,
&freebsd_brand_info);
static Elf64_Brandinfo freebsd_brand_oinfo = {
.brand = ELFOSABI_FREEBSD,
.machine = EM_RISCV,
.compat_3_brand = "FreeBSD",
.emul_path = NULL,
.interp_path = "/usr/libexec/ld-elf.so.1",
.sysvec = &elf64_freebsd_sysvec,
.interp_newpath = NULL,
.brand_note = &elf64_freebsd_brandnote,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
};
SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_ANY,
(sysinit_cfunc_t) elf64_insert_brand_entry,
&freebsd_brand_oinfo);
static int debug_kld;
SYSCTL_INT(_kern, OID_AUTO, debug_kld,
CTLFLAG_RW, &debug_kld, 0,

View File

@ -707,6 +707,7 @@ typedef struct {
#define DT_MIPS_PLTGOT 0x70000032
#define DT_MIPS_RLD_OBJ_UPDATE 0x70000033
#define DT_MIPS_RWPLT 0x70000034
#define DT_MIPS_RLD_MAP_REL 0x70000035
#define DT_PPC_GOT 0x70000000
#define DT_PPC_TLSOPT 0x70000001

View File

@ -334,6 +334,23 @@ test_getuid(uintmax_t num, uintmax_t int_arg __unused, const char *path __unused
return (i);
}
static uintmax_t
test_lstat(uintmax_t num, uintmax_t int_arg __unused, const char *path)
{
struct stat sb;
uintmax_t i;
int error;
benchmark_start();
BENCHMARK_FOREACH(i, num) {
error = lstat(path, &sb);
if (error != 0)
err(-1, "lstat");
}
benchmark_stop();
return (i);
}
static uintmax_t
test_memcpy(uintmax_t num, uintmax_t int_arg, const char *path __unused)
{
@ -823,6 +840,23 @@ test_socketpair_dgram(uintmax_t num, uintmax_t int_arg __unused, const char *pat
return (i);
}
static uintmax_t
test_readlink(uintmax_t num, uintmax_t int_arg __unused, const char *path)
{
char buf[PATH_MAX];
ssize_t rv;
uintmax_t i;
benchmark_start();
BENCHMARK_FOREACH(i, num) {
rv = readlink(path, buf, sizeof(buf));
if (rv < 0 && errno != EINVAL)
err(-1, "readlink");
}
benchmark_stop();
return (i);
}
static uintmax_t
test_vfork(uintmax_t num, uintmax_t int_arg __unused, const char *path __unused)
{
@ -904,6 +938,7 @@ static const struct test tests[] = {
{ "getresuid", test_getresuid, .t_flags = 0 },
{ "gettimeofday", test_gettimeofday, .t_flags = 0 },
{ "getuid", test_getuid, .t_flags = 0 },
{ "lstat", test_lstat, .t_flags = FLAG_PATH },
{ "memcpy_1", test_memcpy, .t_flags = 0, .t_int = 1 },
{ "memcpy_10", test_memcpy, .t_flags = 0, .t_int = 10 },
{ "memcpy_100", test_memcpy, .t_flags = 0, .t_int = 100 },
@ -962,6 +997,7 @@ static const struct test tests[] = {
{ "socketpair_dgram", test_socketpair_dgram, .t_flags = 0 },
{ "socket_tcp", test_socket_stream, .t_int = PF_INET },
{ "socket_udp", test_socket_dgram, .t_int = PF_INET },
{ "readlink", test_readlink, .t_flags = FLAG_PATH },
{ "vfork", test_vfork, .t_flags = 0 },
{ "vfork_exec", test_vfork_exec, .t_flags = 0 },
};