diff options
author | Dan McDonald <danmcd@joyent.com> | 2021-04-19 10:23:09 -0400 |
---|---|---|
committer | Dan McDonald <danmcd@joyent.com> | 2021-04-19 10:23:09 -0400 |
commit | ced4e404c515b8735c4e6d563a547b9a8067c53c (patch) | |
tree | 252e51d6cc61998a8d739eb75b35e0c075c32236 | |
parent | f608a347058c01d3b62c685fe06ea23a960d9f6d (diff) | |
parent | 2282d3b00bd23a5df4dfea0edd5ae737693bd4b7 (diff) | |
download | illumos-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)
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); } |