summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan McDonald <danmcd@joyent.com>2021-04-19 10:23:09 -0400
committerDan McDonald <danmcd@joyent.com>2021-04-19 10:23:09 -0400
commitced4e404c515b8735c4e6d563a547b9a8067c53c (patch)
tree252e51d6cc61998a8d739eb75b35e0c075c32236
parentf608a347058c01d3b62c685fe06ea23a960d9f6d (diff)
parent2282d3b00bd23a5df4dfea0edd5ae737693bd4b7 (diff)
downloadillumos-joyent-ced4e404c515b8735c4e6d563a547b9a8067c53c.tar.gz
[illumos-gate merge]
commit 2282d3b00bd23a5df4dfea0edd5ae737693bd4b7 13713 vm_unmap_mmio() should return non zero on error commit 9558d0b12b2242f8f19a3526ff0656c48b28f657 13712 bhyve allows vmspace mapping inside existing range commit 5920236ba222e7ab53c90f117bfc66be6c043363 13322 build zfs command as 64-bit binary commit 414dafc0a71bccb9c69d6801ed11ba1016a8082b 13714 pcieadm pci check misses renamed nodes 13715 pcieadm save-cfgspace doesn't work with b/d/f 13716 pcieadm save-cfgspace -a can't open files commit 7e85189a2092f2550c3af3a55e22564546838229 13487 want mapfile-based assertions about symbol properties (fix SPARC)
-rw-r--r--usr/src/cmd/ast/libast/mapfile-vers36
-rw-r--r--usr/src/cmd/ast/libshell/mapfile-vers12
-rw-r--r--usr/src/cmd/pcieadm/pcieadm.c51
-rw-r--r--usr/src/cmd/pcieadm/pcieadm.h1
-rw-r--r--usr/src/cmd/pcieadm/pcieadm_cfgspace.c13
-rw-r--r--usr/src/cmd/sgs/libld/common/update.c22
-rw-r--r--usr/src/cmd/sgs/rtld/common/mapfile-vers22
-rw-r--r--usr/src/cmd/sgs/tools/SUNWonld-README1
-rw-r--r--usr/src/cmd/zfs/Makefile11
-rw-r--r--usr/src/lib/gss_mechs/mech_krb5/mapfile-vers6
-rw-r--r--usr/src/lib/libc/port/mapfile-vers52
-rw-r--r--usr/src/lib/libipsecutil/common/mapfile-vers10
-rw-r--r--usr/src/lib/libnisdb/mapfile-vers17
-rw-r--r--usr/src/lib/libwrap/mapfile-vers3
-rw-r--r--usr/src/lib/storage/libg_fc/common/mapfile-vers32
-rw-r--r--usr/src/pkg/manifests/system-test-utiltest.mf1
-rw-r--r--usr/src/test/util-tests/runfiles/default.run2
-rw-r--r--usr/src/test/util-tests/tests/pcieadm/Makefile2
-rw-r--r--usr/src/test/util-tests/tests/pcieadm/pcieadm-priv.ksh130
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm.c5
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_mem.c7
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_mem.h1
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c17
23 files changed, 390 insertions, 64 deletions
diff --git a/usr/src/cmd/ast/libast/mapfile-vers b/usr/src/cmd/ast/libast/mapfile-vers
index 1575e26ab6..4e48d9cf73 100644
--- a/usr/src/cmd/ast/libast/mapfile-vers
+++ b/usr/src/cmd/ast/libast/mapfile-vers
@@ -90,7 +90,13 @@ $elif _ELF32
_Sftable {
ASSERT = {
TYPE = OBJECT;
+ $if _x86
SIZE = 1192;
+ $elif _sparc
+ SIZE = 1248;
+ $else
+ $error Unknown architecture
+ $endif
};
};
_Vmextern {
@@ -1083,31 +1089,61 @@ $elif _ELF32
_Sfstderr {
ASSERT = {
TYPE = OBJECT;
+ $if _x86
SIZE = 104;
+ $elif _sparc
+ SIZE = 112;
+ $else
+ $error Unknown architecture
+ $endif
};
};
_Sfstdin {
ASSERT = {
TYPE = OBJECT;
+ $if _x86
SIZE = 104;
+ $elif _sparc
+ SIZE = 112;
+ $else
+ $error Unknown architecture
+ $endif
};
};
_Sfstdout {
ASSERT = {
TYPE = OBJECT;
+ $if _x86
SIZE = 104;
+ $elif _sparc
+ SIZE = 112;
+ $else
+ $error Unknown architecture
+ $endif
};
};
_Stak_data {
ASSERT = {
TYPE = OBJECT;
+ $if _x86
SIZE = 104;
+ $elif _sparc
+ SIZE = 112;
+ $else
+ $error Unknown architecture
+ $endif
};
};
_ast_conf_data {
ASSERT = {
TYPE = OBJECT;
+ $if _x86
SIZE = 23324;
+ $elif _sparc
+ SIZE = 27440;
+ $else
+ $error Unknown architecture
+ $endif
};
};
$else
diff --git a/usr/src/cmd/ast/libshell/mapfile-vers b/usr/src/cmd/ast/libshell/mapfile-vers
index 344f0697c1..9cfd543e9d 100644
--- a/usr/src/cmd/ast/libshell/mapfile-vers
+++ b/usr/src/cmd/ast/libshell/mapfile-vers
@@ -123,9 +123,21 @@ SYMBOL_VERSION SUNWprivate_1.1 {
# semi-private, needed for shcomp
$if _ELF64
+ $if _x86
sh { ASSERT = { TYPE = OBJECT; SIZE = 1888; }; };
+ $elif _sparc
+ sh { ASSERT = { TYPE = OBJECT; SIZE = 1920; }; };
+ $else
+ $error Unknown architecture
+ $endif
$elif _ELF32
+ $if _x86
sh { ASSERT = { TYPE = OBJECT; SIZE = 1216; }; };
+ $elif _sparc
+ sh { ASSERT = { TYPE = OBJECT; SIZE = 1224; }; };
+ $else
+ $error Unknown architecture
+ $endif
$else
$error unknown ELFCLASS
$endif
diff --git a/usr/src/cmd/pcieadm/pcieadm.c b/usr/src/cmd/pcieadm/pcieadm.c
index edcad6e4d8..f1af0da485 100644
--- a/usr/src/cmd/pcieadm/pcieadm.c
+++ b/usr/src/cmd/pcieadm/pcieadm.c
@@ -129,13 +129,49 @@ pcieadm_ofmt_errx(const char *fmt, ...)
verrx(EXIT_FAILURE, fmt, ap);
}
-boolean_t
+/*
+ * We determine if a node is PCI in a two step process. The first is to see if
+ * the node's name starts with pci, and has an additional character that
+ * indicates it's not the synthetic root of the tree. However, the node name
+ * changes for some classes of devices such as GPUs. As such, for those we try
+ * to look at the compatible property and see if we have a pciexclass or
+ * pciclass entry. We look specifically for the class to make sure that we don't
+ * fall for the synthetic nodes that have a compatible property of
+ * 'pciex_root_complex'.
+ *
+ * The compatible property is a single string that is actually a compressed
+ * string. That is, there are multiple strings concatenated together in a single
+ * pointer.
+ */
+static boolean_t
pcieadm_di_node_is_pci(di_node_t node)
{
const char *name;
+ char *compat;
+ int nents;
name = di_node_name(node);
- return (strncmp("pci", name, 3) == 0);
+ if (strncmp("pci", name, 3) == 0) {
+ return (name[3] != '\0');
+ }
+
+ nents = di_prop_lookup_strings(DDI_DEV_T_ANY, node, "compatible",
+ &compat);
+ if (nents <= 0) {
+ return (B_FALSE);
+ }
+
+ for (int i = 0; i < nents; i++) {
+ if (strncmp("pciclass,", compat, strlen("pciclass,")) == 0 ||
+ strncmp("pciexclass,", compat, strlen("pciexclass,")) ==
+ 0) {
+ return (B_TRUE);
+ }
+
+ compat += strlen(compat) + 1;
+ }
+
+ return (B_FALSE);
}
static int
@@ -147,15 +183,6 @@ pcieadm_di_walk_cb(di_node_t node, void *arg)
return (DI_WALK_CONTINUE);
}
- /*
- * We create synthetic nodes for the root of PCIe tree basically
- * functions as all the resources available for one or more bridges.
- * When we encounter that top-level node skip it.
- */
- if (strcmp("pci", di_node_name(node)) == 0) {
- return (DI_WALK_CONTINUE);
- }
-
return (walk->pdw_func(node, walk->pdw_arg));
}
@@ -216,7 +243,7 @@ pcieadm_find_dip_cb(di_node_t node, void *arg)
}
(void) snprintf(bdf, sizeof (bdf), "%x/%x/%x", PCI_REG_BUS_G(regs[0]),
PCI_REG_DEV_G(regs[0]), PCI_REG_FUNC_G(regs[0]));
- (void) snprintf(bdf, sizeof (bdf), "%02x/%02x/%02x",
+ (void) snprintf(altbdf, sizeof (altbdf), "%02x/%02x/%02x",
PCI_REG_BUS_G(regs[0]), PCI_REG_DEV_G(regs[0]),
PCI_REG_FUNC_G(regs[0]));
diff --git a/usr/src/cmd/pcieadm/pcieadm.h b/usr/src/cmd/pcieadm/pcieadm.h
index b5d44ef970..7ebdc148ca 100644
--- a/usr/src/cmd/pcieadm/pcieadm.h
+++ b/usr/src/cmd/pcieadm/pcieadm.h
@@ -71,7 +71,6 @@ extern void pcieadm_init_cfgspace_file(pcieadm_t *, const char *,
extern void pcieadm_fini_cfgspace_file(void *);
extern void pcieadm_find_nexus(pcieadm_t *);
extern void pcieadm_find_dip(pcieadm_t *, const char *);
-extern boolean_t pcieadm_di_node_is_pci(di_node_t);
/*
* Output related
diff --git a/usr/src/cmd/pcieadm/pcieadm_cfgspace.c b/usr/src/cmd/pcieadm/pcieadm_cfgspace.c
index 50d98c5ec9..32c4be06f4 100644
--- a/usr/src/cmd/pcieadm/pcieadm_cfgspace.c
+++ b/usr/src/cmd/pcieadm/pcieadm_cfgspace.c
@@ -4869,8 +4869,17 @@ pcieadm_save_cfgspace_cb(di_node_t devi, void *arg)
PCI_REG_BUS_G(regs[0]), PCI_REG_DEV_G(regs[0]),
PCI_REG_FUNC_G(regs[0]));
- if ((fd = openat(psc->psc_dirfd, fname, O_WRONLY | O_TRUNC | O_CREAT,
- 0666)) < 0) {
+ if (setppriv(PRIV_SET, PRIV_EFFECTIVE, psc->psc_pci->pia_priv_eff) !=
+ 0) {
+ err(EXIT_FAILURE, "failed to raise privileges");
+ }
+ fd = openat(psc->psc_dirfd, fname, O_WRONLY | O_TRUNC | O_CREAT, 0666);
+ if (setppriv(PRIV_SET, PRIV_EFFECTIVE, psc->psc_pci->pia_priv_min) !=
+ 0) {
+ err(EXIT_FAILURE, "failed to reduce privileges");
+ }
+
+ if (fd < 0) {
warn("failed to create output file %s", fname);
psc->psc_ret = EXIT_FAILURE;
return (DI_WALK_CONTINUE);
diff --git a/usr/src/cmd/sgs/libld/common/update.c b/usr/src/cmd/sgs/libld/common/update.c
index 94692ae22a..2bef6a18a8 100644
--- a/usr/src/cmd/sgs/libld/common/update.c
+++ b/usr/src/cmd/sgs/libld/common/update.c
@@ -3722,11 +3722,11 @@ check_mapfile_assertions(Ofl_desc *ofl)
ld_eprintf(ofl, ERR_FATAL,
MSG_INTL(MSG_ALIAS_NOTALIAS),
ma->ass_file,
- ma->ass_lineno,
+ EC_LINENO(ma->ass_lineno),
ma->ass_sdp->sd_name,
dup->aav_ass->ass_sdp->sd_name,
dup->aav_ass->ass_file,
- dup->aav_ass->ass_lineno);
+ EC_LINENO(dup->aav_ass->ass_lineno));
ret = S_ERROR;
} else {
avl_insert(&ass_avl, av, where);
@@ -3745,7 +3745,7 @@ check_mapfile_assertions(Ofl_desc *ofl)
Sym *sym = sdp->sd_sym;
ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_ASSFAIL_SCOPE),
- ma->ass_file, ma->ass_lineno,
+ ma->ass_file, EC_LINENO(ma->ass_lineno),
demangle(sdp->sd_name),
conv_sym_info_bind(ma->ass_bind, CONV_FMT_ALT_CFNP,
&inv_buf),
@@ -3762,7 +3762,7 @@ check_mapfile_assertions(Ofl_desc *ofl)
NULL, ofl)) == NULL) {
ld_eprintf(ofl, ERR_FATAL,
MSG_INTL(MSG_ALIAS_BADSYM),
- ma->ass_file, ma->ass_lineno,
+ ma->ass_file, EC_LINENO(ma->ass_lineno),
ma->ass_alias);
ret = S_ERROR;
} else {
@@ -3781,7 +3781,8 @@ check_mapfile_assertions(Ofl_desc *ofl)
SYM_ASSERT_ALIAS)) {
ld_eprintf(ofl, ERR_FATAL,
MSG_INTL(MSG_ALIAS_TOALIAS),
- ma->ass_file, ma->ass_lineno,
+ ma->ass_file,
+ EC_LINENO(ma->ass_lineno),
ma->ass_alias);
ret = S_ERROR;
}
@@ -3795,7 +3796,8 @@ check_mapfile_assertions(Ofl_desc *ofl)
ELF_ST_TYPE(sym->st_info))) {
ld_eprintf(ofl, ERR_FATAL,
MSG_INTL(MSG_ASSFAIL_ALIAS),
- ma->ass_file, ma->ass_lineno,
+ ma->ass_file,
+ EC_LINENO(ma->ass_lineno),
demangle(sdp->sd_name),
asdp->sd_name);
ret = S_ERROR;
@@ -3816,7 +3818,7 @@ check_mapfile_assertions(Ofl_desc *ofl)
if (ass_enabled(ma, SYM_ASSERT_SIZE) &&
(ma->ass_size != sdp->sd_sym->st_size)) {
ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_ASSFAIL_SIZE),
- ma->ass_file, ma->ass_lineno,
+ ma->ass_file, EC_LINENO(ma->ass_lineno),
demangle(sdp->sd_name),
ma->ass_size, (Lword)sdp->sd_sym->st_size);
ret = S_ERROR;
@@ -3827,7 +3829,7 @@ check_mapfile_assertions(Ofl_desc *ofl)
(sdp->sd_isc->is_shdr->sh_type == SHT_NOBITS)) {
ld_eprintf(ofl, ERR_FATAL,
MSG_INTL(MSG_ASSFAIL_BITS),
- ma->ass_file, ma->ass_lineno,
+ ma->ass_file, EC_LINENO(ma->ass_lineno),
demangle(sdp->sd_name));
ret = S_ERROR;
}
@@ -3835,7 +3837,7 @@ check_mapfile_assertions(Ofl_desc *ofl)
(sdp->sd_isc->is_shdr->sh_type != SHT_NOBITS)) {
ld_eprintf(ofl, ERR_FATAL,
MSG_INTL(MSG_ASSFAIL_NOBITS),
- ma->ass_file, ma->ass_lineno,
+ ma->ass_file, EC_LINENO(ma->ass_lineno),
demangle(sdp->sd_name));
ret = S_ERROR;
}
@@ -3847,7 +3849,7 @@ check_mapfile_assertions(Ofl_desc *ofl)
ld_eprintf(ofl, ERR_FATAL,
MSG_INTL(MSG_ASSFAIL_TYPE),
- ma->ass_file, ma->ass_lineno,
+ ma->ass_file, EC_LINENO(ma->ass_lineno),
demangle(sdp->sd_name),
conv_sym_info_type(ehdr->e_machine,
ma->ass_type, CONV_FMT_ALT_CFNP, &inv_buf),
diff --git a/usr/src/cmd/sgs/rtld/common/mapfile-vers b/usr/src/cmd/sgs/rtld/common/mapfile-vers
index c67b144f2c..5647f404c4 100644
--- a/usr/src/cmd/sgs/rtld/common/mapfile-vers
+++ b/usr/src/cmd/sgs/rtld/common/mapfile-vers
@@ -84,6 +84,12 @@ SYMBOL_VERSION SUNWprivate_1.3 {
$elif _x86 && _ELF64
SIZE = 80;
+ $elif _sparc && _ELF32
+
+ SIZE = 44;
+ $elif _sparc && _ELF64
+
+ SIZE = 80;
$else
$error Unknown platform
@@ -98,10 +104,10 @@ SYMBOL_VERSION SUNWprivate_1.3 {
lml_main {
ASSERT = {
TYPE = OBJECT;
- $if _x86 && _ELF32
+ $if _ELF32
SIZE = addrsize[41];
- $elif _x86 && _ELF64
+ $elif _ELF64
SIZE = addrsize[38];
$else
@@ -165,7 +171,13 @@ $if _ELF32
reloc32_table {
ASSERT = {
TYPE = OBJECT;
+ $if _x86
SIZE = addrsize[117];
+ $elif _sparc
+ SIZE = addrsize[264];
+ $else
+ $error Unknown architecture
+ $endif
};
};
$elif _ELF64
@@ -173,7 +185,13 @@ $elif _ELF64
reloc64_table {
ASSERT = {
TYPE = OBJECT;
+ $if _x86
SIZE = addrsize[68];
+ $elif _sparc
+ SIZE = addrsize[176];
+ $else
+ $error Unknown architecture
+ $endif
};
};
$else
diff --git a/usr/src/cmd/sgs/tools/SUNWonld-README b/usr/src/cmd/sgs/tools/SUNWonld-README
index 3ae424340c..2b98810bfd 100644
--- a/usr/src/cmd/sgs/tools/SUNWonld-README
+++ b/usr/src/cmd/sgs/tools/SUNWonld-README
@@ -1672,3 +1672,4 @@ Bugid Risk Synopsis
13481 ld(1) should skip GCC local aliases when building symsort sections
13684 ld aborts when input object has no file name
13487 want mapfile-based assertions about symbol properties
+13487 want mapfile-based assertions about symbol properties (fix SPARC)
diff --git a/usr/src/cmd/zfs/Makefile b/usr/src/cmd/zfs/Makefile
index 97642e44f9..6a227e5093 100644
--- a/usr/src/cmd/zfs/Makefile
+++ b/usr/src/cmd/zfs/Makefile
@@ -29,11 +29,11 @@
PROG= zfs
OBJS= zfs_main.o zfs_iter.o zfs_project.o
-SRCS= $(OBJS:%.o=%.c)
POFILES= zfs_main.po zfs_iter.po zfs_project.po
POFILE= zfs.po
include ../Makefile.cmd
+include ../Makefile.cmd.64
include ../Makefile.ctf
FSTYPE= zfs
@@ -50,15 +50,10 @@ INCS += -I$(SRC)/uts/common/fs/zfs
INCS += -I../../lib/libzutil/common
CSTD= $(CSTD_GNU99)
-C99LMODE= -Xc99=%all
-CPPFLAGS += -D_LARGEFILE64_SOURCE=1 -D_REENTRANT $(INCS)
+CPPFLAGS += -D_REENTRANT $(INCS)
$(NOT_RELEASE_BUILD)CPPFLAGS += -DDEBUG
-# lint complains about unused _umem_* functions
-LINTFLAGS += -xerroff=E_NAME_DEF_NOT_USED2
-LINTFLAGS64 += -xerroff=E_NAME_DEF_NOT_USED2
-
ROOTUSRSBINLINKS = $(PROG:%=$(ROOTUSRSBIN)/%)
USRLIBFSTYPELINKS = $(LINKPROGS:%=$(USRLIBFSTYPE)/%)
ROOTETCFSTYPELINKS = $(LINKPROGS:%=$(ROOTETCFSTYPE)/%)
@@ -83,8 +78,6 @@ $(POFILE): $(POFILES)
clean:
$(RM) $(OBJS)
-lint: lint_SRCS
-
# Links from /usr/sbin to /sbin
$(ROOTUSRSBINLINKS):
-$(RM) $@; $(SYMLINK) ../../sbin/$(PROG) $@
diff --git a/usr/src/lib/gss_mechs/mech_krb5/mapfile-vers b/usr/src/lib/gss_mechs/mech_krb5/mapfile-vers
index 81225f7a8a..cdc17fa231 100644
--- a/usr/src/lib/gss_mechs/mech_krb5/mapfile-vers
+++ b/usr/src/lib/gss_mechs/mech_krb5/mapfile-vers
@@ -292,12 +292,16 @@ SYMBOL_VERSION SUNWprivate_1.1 {
kg_make_seq_num;
kg_seal;
kg_unseal;
+$if _x86
$if _ELF64
kg_vdb { ASSERT = { TYPE = OBJECT; SIZE = 48; }; };
$elif _ELF32
kg_vdb { ASSERT = { TYPE = OBJECT; SIZE = 36; }; };
+$endif
+$elif _sparc
+ kg_vdb { ASSERT = { TYPE = OBJECT; SIZE = 48; }; };
$else
-$error unknown ELFCLASS
+$error Unknown architecture
$endif
kpws_error_table;
krb5_425_conv_principal;
diff --git a/usr/src/lib/libc/port/mapfile-vers b/usr/src/lib/libc/port/mapfile-vers
index 1557b5b8e4..fc31a271fd 100644
--- a/usr/src/lib/libc/port/mapfile-vers
+++ b/usr/src/lib/libc/port/mapfile-vers
@@ -1955,12 +1955,21 @@ SYMBOL_VERSION SUNW_0.7 { # SunOS 5.3 (Solaris 2.3)
SIZE = addrsize[6];
};
};
+$if _x86
_sys_fpelist {
ASSERT = {
TYPE = OBJECT;
SIZE = addrsize[9];
};
};
+$else
+ _sys_fpelist {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = addrsize[8];
+ };
+ };
+$endif
_sys_illlist {
ASSERT = {
TYPE = OBJECT;
@@ -2006,12 +2015,21 @@ SYMBOL_VERSION SUNW_0.7 { # SunOS 5.3 (Solaris 2.3)
valloc { FLAGS = NODIRECT; };
$if _ELF32
+$if _x86
_bufendtab {
ASSERT = {
TYPE = OBJECT;
SIZE = 244;
};
};
+$else
+ _bufendtab {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 84;
+ };
+ };
+$endif
_lastbuf {
ASSERT = {
TYPE = OBJECT;
@@ -2280,8 +2298,12 @@ $endif
$if _ELF64
_iob { ASSERT = { TYPE = OBJECT; SIZE = 2560; }; };
$elif _ELF32
+$if _x86
_iob { ASSERT = { TYPE = OBJECT; SIZE = 960; }; };
$else
+ _iob { ASSERT = { TYPE = OBJECT; SIZE = 320; }; };
+$endif
+$else
$error unknown ELFCLASS
$endif
@@ -3295,6 +3317,7 @@ $if _ELF64
};
};
$elif _ELF32
+$if _x86
_smbuf {
ASSERT = {
TYPE = OBJECT;
@@ -3302,6 +3325,14 @@ $elif _ELF32
};
};
$else
+ _smbuf {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 168;
+ };
+ };
+$endif
+$else
$error unknown ELFCLASS
$endif
_sp {
@@ -3531,9 +3562,24 @@ $error unknown platform
$endif
$if _sparc
- __lyday_to_month;
- __mon_lengths;
- __yday_to_month;
+ __lyday_to_month {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 48;
+ };
+ };
+ __mon_lengths {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 96;
+ };
+ };
+ __yday_to_month {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 48;
+ };
+ };
$endif
$if i386
_sse_hw {
diff --git a/usr/src/lib/libipsecutil/common/mapfile-vers b/usr/src/lib/libipsecutil/common/mapfile-vers
index b023c23a53..a682d0cadd 100644
--- a/usr/src/lib/libipsecutil/common/mapfile-vers
+++ b/usr/src/lib/libipsecutil/common/mapfile-vers
@@ -56,12 +56,16 @@ SYMBOL_VERSION SUNWprivate_1.1 {
dump_key;
dump_sadb_idtype;
dump_sockaddr;
-$if _ELF64
+$if _x86 && _ELF64
env { ASSERT = { TYPE = OBJECT; SIZE = 64; }; };
-$elif _ELF32
+$elif _x86 && _ELF32
env { ASSERT = { TYPE = OBJECT; SIZE = 40; }; };
+$elif _sparc && _ELF64
+ env { ASSERT = { TYPE = OBJECT; SIZE = 96; }; };
+$elif _sparc && _ELF32
+ env { ASSERT = { TYPE = OBJECT; SIZE = 48; }; };
$else
-$error unknown ELFCLASS
+$error Unknown architecture
$endif
_errfp { TYPE = FUNCTION; FILTER = libc.so.1; };
_errxfp { TYPE = FUNCTION; FILTER = libc.so.1; };
diff --git a/usr/src/lib/libnisdb/mapfile-vers b/usr/src/lib/libnisdb/mapfile-vers
index deee02c155..8048d48a3f 100644
--- a/usr/src/lib/libnisdb/mapfile-vers
+++ b/usr/src/lib/libnisdb/mapfile-vers
@@ -129,6 +129,7 @@ SYMBOL_VERSION SUNWprivate_2.1 {
SIZE = 60;
};
};
+$if _x86
ldapDBTableMapping {
ASSERT = {
TYPE = OBJECT;
@@ -141,6 +142,22 @@ SYMBOL_VERSION SUNWprivate_2.1 {
SIZE = 340;
};
};
+$elif _sparc
+ ldapDBTableMapping {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 144;
+ };
+ };
+ ldapMappingList {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 344;
+ };
+ };
+$else
+$error Unknown architecture
+$endif
loadAllLDAP;
lock_core;
lock_map;
diff --git a/usr/src/lib/libwrap/mapfile-vers b/usr/src/lib/libwrap/mapfile-vers
index 85dc40f09e..714e3e622e 100644
--- a/usr/src/lib/libwrap/mapfile-vers
+++ b/usr/src/lib/libwrap/mapfile-vers
@@ -112,6 +112,9 @@ SYMBOL_VERSION ILLUMOS_0.1 {
$elif _x86 && _ELF32
SIZE = addrsize[10];
+ $elif _sparc
+
+ SIZE = addrsize[12];
$else
$error Unknown architecture
diff --git a/usr/src/lib/storage/libg_fc/common/mapfile-vers b/usr/src/lib/storage/libg_fc/common/mapfile-vers
index 8515664d10..120c99526a 100644
--- a/usr/src/lib/storage/libg_fc/common/mapfile-vers
+++ b/usr/src/lib/storage/libg_fc/common/mapfile-vers
@@ -81,8 +81,18 @@ SYMBOL_VERSION SUNW_2.0 {
g_scsi_send_diag_cmd;
g_scsi_tur;
g_scsi_writebuffer_cmd;
- g_switch_to_alpa;
- g_sf_alpa_to_switch;
+ g_switch_to_alpa {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 126;
+ };
+ };
+ g_sf_alpa_to_switch {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 240;
+ };
+ };
g_i18n_catopen;
g_port_offline;
g_port_online;
@@ -113,7 +123,23 @@ SYMBOL_VERSION SUNW_2.0 {
g_scsi_inquiry_cmd;
g_scsi_persistent_reserve_in_cmd;
g_get_path_type;
- l_catd;
+$if _ELF32
+ l_catd {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 4;
+ };
+ };
+$elif _ELF64
+ l_catd {
+ ASSERT = {
+ TYPE = OBJECT;
+ SIZE = 8;
+ };
+ };
+$else
+$error Unknown ELFCLASS
+$endif
g_get_lun_str;
g_get_lun_number;
g_get_pathlist;
diff --git a/usr/src/pkg/manifests/system-test-utiltest.mf b/usr/src/pkg/manifests/system-test-utiltest.mf
index 914154281f..cb280747ca 100644
--- a/usr/src/pkg/manifests/system-test-utiltest.mf
+++ b/usr/src/pkg/manifests/system-test-utiltest.mf
@@ -1703,6 +1703,7 @@ file path=opt/util-tests/tests/pci/igb-ltr-p.out mode=0444
file path=opt/util-tests/tests/pci/igb-ltr.out mode=0444
file path=opt/util-tests/tests/pci/igb.pci mode=0444
file path=opt/util-tests/tests/pcidbtest mode=0555
+file path=opt/util-tests/tests/pcieadm-priv mode=0555
file path=opt/util-tests/tests/pcieadmtest mode=0555
file path=opt/util-tests/tests/printf_test mode=0555
file path=opt/util-tests/tests/sed/multi_test mode=0555
diff --git a/usr/src/test/util-tests/runfiles/default.run b/usr/src/test/util-tests/runfiles/default.run
index 9b8ba57fbf..b352c96118 100644
--- a/usr/src/test/util-tests/runfiles/default.run
+++ b/usr/src/test/util-tests/runfiles/default.run
@@ -89,3 +89,5 @@ tests = ['sed_addr', 'multi_test']
[/opt/util-tests/tests/pcidbtest]
[/opt/util-tests/tests/pcieadmtest]
+[/opt/util-tests/tests/pcieadm-priv]
+user = root
diff --git a/usr/src/test/util-tests/tests/pcieadm/Makefile b/usr/src/test/util-tests/tests/pcieadm/Makefile
index 59a995f0ea..dff5374614 100644
--- a/usr/src/test/util-tests/tests/pcieadm/Makefile
+++ b/usr/src/test/util-tests/tests/pcieadm/Makefile
@@ -18,7 +18,7 @@ include $(SRC)/test/Makefile.com
ROOTOPTPKG = $(ROOT)/opt/util-tests/tests
ROOTOPTPCI = $(ROOT)/opt/util-tests/tests/pci
-PROG = pcieadmtest
+PROG = pcieadmtest pcieadm-priv
DATAFILES = bridge.pci igb.pci \
header0-basic.out \
header0-basic-L.out \
diff --git a/usr/src/test/util-tests/tests/pcieadm/pcieadm-priv.ksh b/usr/src/test/util-tests/tests/pcieadm/pcieadm-priv.ksh
new file mode 100644
index 0000000000..0e9c8bc796
--- /dev/null
+++ b/usr/src/test/util-tests/tests/pcieadm/pcieadm-priv.ksh
@@ -0,0 +1,130 @@
+#!/usr/bin/ksh
+#
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright 2021 Oxide Computer Company
+#
+
+#
+# Additional testing for pcieadm that requires us to actually have
+# privileges rather than relying on existing pieces.
+#
+
+unalias -a
+set -o pipefail
+
+pcieadm_arg0="$(basename $0)"
+pcieadm_prog="/usr/lib/pci/pcieadm"
+pcieadm_tmp="/tmp/pcieadm-priv.$$"
+pcieadm_bdf=""
+pcieadm_dev=""
+pcieadm_path=""
+
+warn()
+{
+ typeset msg="$*"
+ [[ -z "$msg" ]] && msg="failed"
+ echo "TEST FAILED: $pcieadm_arg0: $msg" >&2
+ pcieadm_exit=1
+}
+
+pcieadm_validate_filter()
+{
+ typeset filter="$1"
+
+ if ! $pcieadm_prog show-devs $filter >/dev/null; then
+ warn "failed to show-devs with filter $filter"
+ else
+ printf "TEST PASSED: show-devs $filter\n"
+ fi
+
+ if ! $pcieadm_prog show-cfgspace -d $filter >/dev/null; then
+ warn "failed to show-cfgspace with filter $filter"
+ else
+ printf "TEST PASSED: show-cfgspace -d $filter\n"
+ fi
+
+ if ! $pcieadm_prog save-cfgspace -d $filter "$pcieadm_tmp/out.bin"; then
+ warn "failed to use save-cfgspace -d $filter"
+ else
+ printf "TEST PASSED: save-cfgspace -d $filter\n"
+ fi
+}
+
+#
+# Before we begin execution, set up the environment such that we have a
+# standard locale and that umem will help us catch mistakes.
+#
+export LC_ALL=C.UTF-8
+export LD_PRELOAD=libumem.so
+export UMEM_DEBUG=default
+
+if [[ -n $PCIEADM ]]; then
+ pcieadm_prog=$PCIEADM
+fi
+
+if ! $pcieadm_prog show-devs >/dev/null; then
+ warn "failed to show devices"
+else
+ printf "successfully listed devices\n"
+fi
+
+if ! mkdir "$pcieadm_tmp"; then
+ warn "failed to create temporary directory"
+ exit $pcieadm_exit
+fi
+
+#
+# Verify that we can grab things based on bdf
+#
+pcieadm_bdf=$($pcieadm_prog show-devs -p -o bdf | \
+ awk '{ print $1; exit 0 }')
+if [[ -z "$pcieadm_bdf" ]]; then
+ warn "failed to obtain bdf based filter"
+else
+ pcieadm_validate_filter "$pcieadm_bdf"
+fi
+
+#
+# Verify based on device.
+#
+pcieadm_path=$($pcieadm_prog show-devs -p -o path | \
+ awk '{ print $1; exit 0 }')
+if [[ -z "$pcieadm_path" ]]; then
+ warn "failed to obtain path based filter"
+else
+ pcieadm_validate_filter "$pcieadm_path"
+fi
+
+#
+# Do the same based on the device name
+#
+pcieadm_dev=$($pcieadm_prog show-devs -p -o driver | \
+ awk '{ if ($1 != "--") { print $1; exit 0 } }')
+if [[ -z "$pcieadm_dev" ]]; then
+ warn "failed to obtain driver based filter"
+else
+ pcieadm_validate_filter "$pcieadm_dev"
+fi
+
+if ! $pcieadm_prog save-cfgspace -a "$pcieadm_tmp" > /dev/null; then
+ warn "failed to save all devices"
+else
+ printf "TEST PASSED: save-cfgspace -a\n"
+fi
+
+if (( pcieadm_exit == 0 )); then
+ printf "All tests passed successfully!\n"
+fi
+rm -rf "$pcieadm_tmp"
+exit $pcieadm_exit
diff --git a/usr/src/uts/i86pc/io/vmm/vmm.c b/usr/src/uts/i86pc/io/vmm/vmm.c
index dac488713a..caad5c8be1 100644
--- a/usr/src/uts/i86pc/io/vmm/vmm.c
+++ b/usr/src/uts/i86pc/io/vmm/vmm.c
@@ -40,6 +40,7 @@
* Copyright 2015 Pluribus Networks Inc.
* Copyright 2021 Joyent, Inc.
* Copyright 2021 Oxide Computer Company
+ * Copyright 2021 OmniOS Community Edition (OmniOSce) Association.
*/
#include <sys/cdefs.h>
@@ -714,9 +715,7 @@ vm_map_mmio(struct vm *vm, vm_paddr_t gpa, size_t len, vm_paddr_t hpa)
int
vm_unmap_mmio(struct vm *vm, vm_paddr_t gpa, size_t len)
{
-
- vmm_mmio_free(vm->vmspace, gpa, len);
- return (0);
+ return (vm_map_remove(&vm->vmspace->vm_map, gpa, gpa + len));
}
/*
diff --git a/usr/src/uts/i86pc/io/vmm/vmm_mem.c b/usr/src/uts/i86pc/io/vmm/vmm_mem.c
index 443a6ffc6f..26862397a1 100644
--- a/usr/src/uts/i86pc/io/vmm/vmm_mem.c
+++ b/usr/src/uts/i86pc/io/vmm/vmm_mem.c
@@ -109,13 +109,6 @@ vmm_mmio_alloc(struct vmspace *vmspace, vm_paddr_t gpa, size_t len,
return (obj);
}
-void
-vmm_mmio_free(struct vmspace *vmspace, vm_paddr_t gpa, size_t len)
-{
-
- vm_map_remove(&vmspace->vm_map, gpa, gpa + len);
-}
-
vm_paddr_t
vmm_mem_maxaddr(void)
{
diff --git a/usr/src/uts/i86pc/io/vmm/vmm_mem.h b/usr/src/uts/i86pc/io/vmm/vmm_mem.h
index eaa499c51a..b27501eef2 100644
--- a/usr/src/uts/i86pc/io/vmm/vmm_mem.h
+++ b/usr/src/uts/i86pc/io/vmm/vmm_mem.h
@@ -49,7 +49,6 @@ struct vm_object;
int vmm_mem_init(void);
struct vm_object *vmm_mmio_alloc(struct vmspace *, vm_paddr_t gpa, size_t len,
vm_paddr_t hpa);
-void vmm_mmio_free(struct vmspace *, vm_paddr_t gpa, size_t size);
vm_paddr_t vmm_mem_maxaddr(void);
#endif
diff --git a/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c b/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c
index bedc338474..a280c1d255 100644
--- a/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c
+++ b/usr/src/uts/i86pc/io/vmm/vmm_sol_vm.c
@@ -13,6 +13,7 @@
/*
* Copyright 2019 Joyent, Inc.
* Copyright 2020 Oxide Computer Company
+ * Copyright 2021 OmniOS Community Edition (OmniOSce) Association.
*/
#include <sys/param.h>
@@ -624,17 +625,21 @@ vm_mapping_gap(struct vmspace *vms, uintptr_t addr, size_t size)
{
vmspace_mapping_t *vmsm;
list_t *ml = &vms->vms_maplist;
- const uintptr_t range_end = addr + size;
+ const uintptr_t range_end = addr + size - 1;
ASSERT(MUTEX_HELD(&vms->vms_lock));
+ ASSERT(size > 0);
for (vmsm = list_head(ml); vmsm != NULL; vmsm = list_next(ml, vmsm)) {
- const uintptr_t seg_end = vmsm->vmsm_addr + vmsm->vmsm_len;
+ const uintptr_t seg_end = vmsm->vmsm_addr + vmsm->vmsm_len - 1;
- if ((vmsm->vmsm_addr >= addr && vmsm->vmsm_addr < range_end) ||
- (seg_end > addr && seg_end < range_end)) {
- return (B_FALSE);
- }
+ /*
+ * The two ranges do not overlap if the start of either of
+ * them is after the end of the other.
+ */
+ if (vmsm->vmsm_addr > range_end || addr > seg_end)
+ continue;
+ return (B_FALSE);
}
return (B_TRUE);
}