From owner-svn-src-projects@freebsd.org Thu Jan 26 15:37:56 2017 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6325BCC21E4 for ; Thu, 26 Jan 2017 15:37:56 +0000 (UTC) (envelope-from ae@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2BA0BC93; Thu, 26 Jan 2017 15:37:56 +0000 (UTC) (envelope-from ae@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v0QFbtMB067048; Thu, 26 Jan 2017 15:37:55 GMT (envelope-from ae@FreeBSD.org) Received: (from ae@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v0QFbr0P067027; Thu, 26 Jan 2017 15:37:53 GMT (envelope-from ae@FreeBSD.org) Message-Id: <201701261537.v0QFbr0P067027@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ae set sender to ae@FreeBSD.org using -f From: "Andrey V. Elsukov" Date: Thu, 26 Jan 2017 15:37:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r312817 - in projects/ipsec: contrib/elftoolchain/strings contrib/ipfilter/lib contrib/ipfilter/tools contrib/llvm/include/llvm/Analysis contrib/llvm/lib/Analysis lib/libthr/thread libe... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Jan 2017 15:37:56 -0000 Author: ae Date: Thu Jan 26 15:37:53 2017 New Revision: 312817 URL: https://svnweb.freebsd.org/changeset/base/312817 Log: Merge from head/ Added: projects/ipsec/sys/arm/mv/armada/ - copied from r312816, head/sys/arm/mv/armada/ projects/ipsec/sys/dev/ahci/ahci_mv_fdt.c - copied unchanged from r312816, head/sys/dev/ahci/ahci_mv_fdt.c Modified: projects/ipsec/contrib/elftoolchain/strings/strings.c projects/ipsec/contrib/ipfilter/lib/rwlock_emul.c projects/ipsec/contrib/ipfilter/tools/ipf.c projects/ipsec/contrib/llvm/include/llvm/Analysis/ScalarEvolution.h projects/ipsec/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h projects/ipsec/contrib/llvm/lib/Analysis/ScalarEvolution.cpp projects/ipsec/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp projects/ipsec/lib/libthr/thread/thr_exit.c projects/ipsec/libexec/rtld-elf/aarch64/reloc.c projects/ipsec/share/misc/committers-ports.dot projects/ipsec/share/misc/scsi_modes projects/ipsec/sys/arm/arm/pmap-v6.c projects/ipsec/sys/arm/conf/ARMADA38X projects/ipsec/sys/arm/include/pcpu.h projects/ipsec/sys/arm/mv/armada38x/files.armada38x projects/ipsec/sys/arm/mv/files.mv projects/ipsec/sys/arm/mv/mv_common.c projects/ipsec/sys/arm/mv/mvwin.h projects/ipsec/sys/cam/cam_iosched.c projects/ipsec/sys/cam/ctl/ctl.h projects/ipsec/sys/cam/ctl/ctl_io.h projects/ipsec/sys/cam/ctl/ctl_ioctl.h projects/ipsec/sys/cam/ctl/ctl_private.h projects/ipsec/sys/cddl/dev/dtrace/dtrace_ioctl.c projects/ipsec/sys/contrib/ipfilter/netinet/ip_compat.h projects/ipsec/sys/contrib/ipfilter/netinet/ip_frag.c projects/ipsec/sys/dev/ahci/ahci.c projects/ipsec/sys/dev/ahci/ahci.h projects/ipsec/sys/dev/ahci/ahci_pci.c projects/ipsec/sys/dev/cesa/cesa.c projects/ipsec/sys/dev/cesa/cesa.h projects/ipsec/sys/dev/e1000/em_txrx.c projects/ipsec/sys/dev/fdt/fdt_common.h projects/ipsec/sys/dev/ofw/ofw_bus_subr.c projects/ipsec/sys/dev/ofw/ofw_bus_subr.h projects/ipsec/sys/dev/qlxgbe/ql_def.h projects/ipsec/sys/dev/qlxgbe/ql_glbl.h projects/ipsec/sys/dev/qlxgbe/ql_hw.c projects/ipsec/sys/dev/qlxgbe/ql_hw.h projects/ipsec/sys/dev/qlxgbe/ql_isr.c projects/ipsec/sys/dev/qlxgbe/ql_os.c projects/ipsec/sys/dev/qlxgbe/ql_os.h projects/ipsec/sys/dev/qlxgbe/ql_ver.h projects/ipsec/sys/kern/kern_ntptime.c projects/ipsec/sys/kern/subr_gtaskqueue.c projects/ipsec/sys/kern/uipc_usrreq.c projects/ipsec/sys/net/if.c projects/ipsec/sys/net/if_bridge.c projects/ipsec/sys/net/if_bridgevar.h projects/ipsec/sys/net/iflib.c projects/ipsec/sys/netinet/in.c projects/ipsec/sys/netinet/ip_carp.c projects/ipsec/sys/netinet/ip_carp.h projects/ipsec/sys/netinet6/in6.c projects/ipsec/sys/sys/capability.h projects/ipsec/sys/sys/gtaskqueue.h Directory Properties: projects/ipsec/ (props changed) projects/ipsec/contrib/elftoolchain/ (props changed) projects/ipsec/contrib/ipfilter/ (props changed) projects/ipsec/contrib/llvm/ (props changed) projects/ipsec/sys/contrib/ipfilter/ (props changed) Modified: projects/ipsec/contrib/elftoolchain/strings/strings.c ============================================================================== --- projects/ipsec/contrib/elftoolchain/strings/strings.c Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/contrib/elftoolchain/strings/strings.c Thu Jan 26 15:37:53 2017 (r312817) @@ -189,7 +189,7 @@ main(int argc, char **argv) if (!min_len) min_len = 4; if (!*argv) - rc = handle_file("{standard input}"); + rc = find_strings("{standard input}", 0, 0); else while (*argv) { if (handle_file(*argv) != 0) rc = 1; @@ -205,13 +205,9 @@ handle_file(const char *name) if (name == NULL) return (1); - if (strcmp("{standard input}", name) != 0) { - if (freopen(name, "rb", stdin) == NULL) { - warnx("'%s': %s", name, strerror(errno)); - return (1); - } - } else { - return (find_strings(name, (off_t)0, (off_t)0)); + if (freopen(name, "rb", stdin) == NULL) { + warnx("'%s': %s", name, strerror(errno)); + return (1); } fd = fileno(stdin); Modified: projects/ipsec/contrib/ipfilter/lib/rwlock_emul.c ============================================================================== --- projects/ipsec/contrib/ipfilter/lib/rwlock_emul.c Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/contrib/ipfilter/lib/rwlock_emul.c Thu Jan 26 15:37:53 2017 (r312817) @@ -56,6 +56,27 @@ void eMrwlock_write_enter(rw, file, line } +void eMrwlock_try_upgrade(rw, file, line) + eMrwlock_t *rw; + char *file; + int line; +{ + if (rw->eMrw_magic != EMM_MAGIC) { + fprintf(stderr, "%s:eMrwlock_write_enter(%p): bad magic: %#x\n", + rw->eMrw_owner, rw, rw->eMrw_magic); + abort(); + } + if (rw->eMrw_read != 0 || rw->eMrw_write != 0) { + fprintf(stderr, + "%s:eMrwlock_try_upgrade(%p): already locked: %d/%d\n", + rw->eMrw_owner, rw, rw->eMrw_read, rw->eMrw_write); + abort(); + } + rw->eMrw_write++; + rw->eMrw_heldin = file; + rw->eMrw_heldat = line; +} + void eMrwlock_downgrade(rw, file, line) eMrwlock_t *rw; char *file; Modified: projects/ipsec/contrib/ipfilter/tools/ipf.c ============================================================================== --- projects/ipsec/contrib/ipfilter/tools/ipf.c Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/contrib/ipfilter/tools/ipf.c Thu Jan 26 15:37:53 2017 (r312817) @@ -408,14 +408,16 @@ static void flushfilter(arg, filter) } closedevice(); return; - } - - if (strchr(arg, 'i') || strchr(arg, 'I')) + } else if (strchr(arg, 'i') || strchr(arg, 'I')) fl = FR_INQUE; - if (strchr(arg, 'o') || strchr(arg, 'O')) + else if (strchr(arg, 'o') || strchr(arg, 'O')) fl = FR_OUTQUE; - if (strchr(arg, 'a') || strchr(arg, 'A')) + else if (strchr(arg, 'a') || strchr(arg, 'A')) fl = FR_OUTQUE|FR_INQUE; + else { + fprintf(stderr, "Incorrect flush argument: %s\n", arg); + usage(); + } if (opts & OPT_INACTIVE) fl |= FR_INACTIVE; rem = fl; Modified: projects/ipsec/contrib/llvm/include/llvm/Analysis/ScalarEvolution.h ============================================================================== --- projects/ipsec/contrib/llvm/include/llvm/Analysis/ScalarEvolution.h Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/contrib/llvm/include/llvm/Analysis/ScalarEvolution.h Thu Jan 26 15:37:53 2017 (r312817) @@ -495,10 +495,29 @@ namespace llvm { /// The typedef for ExprValueMap. /// - typedef DenseMap> ExprValueMapType; + typedef std::pair ValueOffsetPair; + typedef DenseMap> ExprValueMapType; /// ExprValueMap -- This map records the original values from which /// the SCEV expr is generated from. + /// + /// We want to represent the mapping as SCEV -> ValueOffsetPair instead + /// of SCEV -> Value: + /// Suppose we know S1 expands to V1, and + /// S1 = S2 + C_a + /// S3 = S2 + C_b + /// where C_a and C_b are different SCEVConstants. Then we'd like to + /// expand S3 as V1 - C_a + C_b instead of expanding S2 literally. + /// It is helpful when S2 is a complex SCEV expr. + /// + /// In order to do that, we represent ExprValueMap as a mapping from + /// SCEV to ValueOffsetPair. We will save both S1->{V1, 0} and + /// S2->{V1, C_a} into the map when we create SCEV for V1. When S3 + /// is expanded, it will first expand S2 to V1 - C_a because of + /// S2->{V1, C_a} in the map, then expand S3 to V1 - C_a + C_b. + /// + /// Note: S->{V, Offset} in the ExprValueMap means S can be expanded + /// to V - Offset. ExprValueMapType ExprValueMap; /// The typedef for ValueExprMap. @@ -1181,7 +1200,7 @@ namespace llvm { bool containsAddRecurrence(const SCEV *S); /// Return the Value set from which the SCEV expr is generated. - SetVector *getSCEVValues(const SCEV *S); + SetVector *getSCEVValues(const SCEV *S); /// Erase Value from ValueExprMap and ExprValueMap. void eraseValueFromMap(Value *V); Modified: projects/ipsec/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h ============================================================================== --- projects/ipsec/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h Thu Jan 26 15:37:53 2017 (r312817) @@ -325,7 +325,8 @@ namespace llvm { PointerType *PTy, Type *Ty, Value *V); /// \brief Find a previous Value in ExprValueMap for expand. - Value *FindValueInExprValueMap(const SCEV *S, const Instruction *InsertPt); + ScalarEvolution::ValueOffsetPair + FindValueInExprValueMap(const SCEV *S, const Instruction *InsertPt); Value *expand(const SCEV *S); Modified: projects/ipsec/contrib/llvm/lib/Analysis/ScalarEvolution.cpp ============================================================================== --- projects/ipsec/contrib/llvm/lib/Analysis/ScalarEvolution.cpp Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/contrib/llvm/lib/Analysis/ScalarEvolution.cpp Thu Jan 26 15:37:53 2017 (r312817) @@ -3378,8 +3378,28 @@ bool ScalarEvolution::containsAddRecurre return F.FoundOne; } -/// Return the Value set from S. -SetVector *ScalarEvolution::getSCEVValues(const SCEV *S) { +/// Try to split a SCEVAddExpr into a pair of {SCEV, ConstantInt}. +/// If \p S is a SCEVAddExpr and is composed of a sub SCEV S' and an +/// offset I, then return {S', I}, else return {\p S, nullptr}. +static std::pair splitAddExpr(const SCEV *S) { + const auto *Add = dyn_cast(S); + if (!Add) + return {S, nullptr}; + + if (Add->getNumOperands() != 2) + return {S, nullptr}; + + auto *ConstOp = dyn_cast(Add->getOperand(0)); + if (!ConstOp) + return {S, nullptr}; + + return {Add->getOperand(1), ConstOp->getValue()}; +} + +/// Return the ValueOffsetPair set for \p S. \p S can be represented +/// by the value and offset from any ValueOffsetPair in the set. +SetVector * +ScalarEvolution::getSCEVValues(const SCEV *S) { ExprValueMapType::iterator SI = ExprValueMap.find_as(S); if (SI == ExprValueMap.end()) return nullptr; @@ -3387,24 +3407,31 @@ SetVector *ScalarEvolution::get if (VerifySCEVMap) { // Check there is no dangling Value in the set returned. for (const auto &VE : SI->second) - assert(ValueExprMap.count(VE)); + assert(ValueExprMap.count(VE.first)); } #endif return &SI->second; } -/// Erase Value from ValueExprMap and ExprValueMap. If ValueExprMap.erase(V) is -/// not used together with forgetMemoizedResults(S), eraseValueFromMap should be -/// used instead to ensure whenever V->S is removed from ValueExprMap, V is also -/// removed from the set of ExprValueMap[S]. +/// Erase Value from ValueExprMap and ExprValueMap. ValueExprMap.erase(V) +/// cannot be used separately. eraseValueFromMap should be used to remove +/// V from ValueExprMap and ExprValueMap at the same time. void ScalarEvolution::eraseValueFromMap(Value *V) { ValueExprMapType::iterator I = ValueExprMap.find_as(V); if (I != ValueExprMap.end()) { const SCEV *S = I->second; - SetVector *SV = getSCEVValues(S); - // Remove V from the set of ExprValueMap[S] - if (SV) - SV->remove(V); + // Remove {V, 0} from the set of ExprValueMap[S] + if (SetVector *SV = getSCEVValues(S)) + SV->remove({V, nullptr}); + + // Remove {V, Offset} from the set of ExprValueMap[Stripped] + const SCEV *Stripped; + ConstantInt *Offset; + std::tie(Stripped, Offset) = splitAddExpr(S); + if (Offset != nullptr) { + if (SetVector *SV = getSCEVValues(Stripped)) + SV->remove({V, Offset}); + } ValueExprMap.erase(V); } } @@ -3419,11 +3446,26 @@ const SCEV *ScalarEvolution::getSCEV(Val S = createSCEV(V); // During PHI resolution, it is possible to create two SCEVs for the same // V, so it is needed to double check whether V->S is inserted into - // ValueExprMap before insert S->V into ExprValueMap. + // ValueExprMap before insert S->{V, 0} into ExprValueMap. std::pair Pair = ValueExprMap.insert({SCEVCallbackVH(V, this), S}); - if (Pair.second) - ExprValueMap[S].insert(V); + if (Pair.second) { + ExprValueMap[S].insert({V, nullptr}); + + // If S == Stripped + Offset, add Stripped -> {V, Offset} into + // ExprValueMap. + const SCEV *Stripped = S; + ConstantInt *Offset = nullptr; + std::tie(Stripped, Offset) = splitAddExpr(S); + // If stripped is SCEVUnknown, don't bother to save + // Stripped -> {V, offset}. It doesn't simplify and sometimes even + // increase the complexity of the expansion code. + // If V is GetElementPtrInst, don't save Stripped -> {V, offset} + // because it may generate add/sub instead of GEP in SCEV expansion. + if (Offset != nullptr && !isa(Stripped) && + !isa(V)) + ExprValueMap[Stripped].insert({V, Offset}); + } } return S; } @@ -3436,8 +3478,8 @@ const SCEV *ScalarEvolution::getExisting const SCEV *S = I->second; if (checkValidity(S)) return S; + eraseValueFromMap(V); forgetMemoizedResults(S); - ValueExprMap.erase(I); } return nullptr; } @@ -3675,8 +3717,8 @@ void ScalarEvolution::forgetSymbolicName if (!isa(I) || !isa(Old) || (I != PN && Old == SymName)) { + eraseValueFromMap(It->first); forgetMemoizedResults(Old); - ValueExprMap.erase(It); } } @@ -4055,7 +4097,7 @@ const SCEV *ScalarEvolution::createAddRe // to create an AddRecExpr for this PHI node. We can not keep this temporary // as it will prevent later (possibly simpler) SCEV expressions to be added // to the ValueExprMap. - ValueExprMap.erase(PN); + eraseValueFromMap(PN); } return nullptr; @@ -5435,8 +5477,8 @@ ScalarEvolution::getBackedgeTakenInfo(co // case, createNodeForPHI will perform the necessary updates on its // own when it gets to that point. if (!isa(I) || !isa(Old)) { + eraseValueFromMap(It->first); forgetMemoizedResults(Old); - ValueExprMap.erase(It); } if (PHINode *PN = dyn_cast(I)) ConstantEvolutionLoopExitValue.erase(PN); @@ -5481,8 +5523,8 @@ void ScalarEvolution::forgetLoop(const L ValueExprMapType::iterator It = ValueExprMap.find_as(static_cast(I)); if (It != ValueExprMap.end()) { + eraseValueFromMap(It->first); forgetMemoizedResults(It->second); - ValueExprMap.erase(It); if (PHINode *PN = dyn_cast(I)) ConstantEvolutionLoopExitValue.erase(PN); } @@ -5515,8 +5557,8 @@ void ScalarEvolution::forgetValue(Value ValueExprMapType::iterator It = ValueExprMap.find_as(static_cast(I)); if (It != ValueExprMap.end()) { + eraseValueFromMap(It->first); forgetMemoizedResults(It->second); - ValueExprMap.erase(It); if (PHINode *PN = dyn_cast(I)) ConstantEvolutionLoopExitValue.erase(PN); } Modified: projects/ipsec/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp ============================================================================== --- projects/ipsec/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp Thu Jan 26 15:37:53 2017 (r312817) @@ -1625,9 +1625,10 @@ Value *SCEVExpander::expandCodeFor(const return V; } -Value *SCEVExpander::FindValueInExprValueMap(const SCEV *S, - const Instruction *InsertPt) { - SetVector *Set = SE.getSCEVValues(S); +ScalarEvolution::ValueOffsetPair +SCEVExpander::FindValueInExprValueMap(const SCEV *S, + const Instruction *InsertPt) { + SetVector *Set = SE.getSCEVValues(S); // If the expansion is not in CanonicalMode, and the SCEV contains any // sub scAddRecExpr type SCEV, it is required to expand the SCEV literally. if (CanonicalMode || !SE.containsAddRecurrence(S)) { @@ -1636,21 +1637,21 @@ Value *SCEVExpander::FindValueInExprValu // Choose a Value from the set which dominates the insertPt. // insertPt should be inside the Value's parent loop so as not to break // the LCSSA form. - for (auto const &Ent : *Set) { + for (auto const &VOPair : *Set) { + Value *V = VOPair.first; + ConstantInt *Offset = VOPair.second; Instruction *EntInst = nullptr; - if (Ent && isa(Ent) && - (EntInst = cast(Ent)) && - S->getType() == Ent->getType() && + if (V && isa(V) && (EntInst = cast(V)) && + S->getType() == V->getType() && EntInst->getFunction() == InsertPt->getFunction() && SE.DT.dominates(EntInst, InsertPt) && (SE.LI.getLoopFor(EntInst->getParent()) == nullptr || - SE.LI.getLoopFor(EntInst->getParent())->contains(InsertPt))) { - return Ent; - } + SE.LI.getLoopFor(EntInst->getParent())->contains(InsertPt))) + return {V, Offset}; } } } - return nullptr; + return {nullptr, nullptr}; } // The expansion of SCEV will either reuse a previous Value in ExprValueMap, @@ -1698,10 +1699,14 @@ Value *SCEVExpander::expand(const SCEV * Builder.SetInsertPoint(InsertPt); // Expand the expression into instructions. - Value *V = FindValueInExprValueMap(S, InsertPt); + ScalarEvolution::ValueOffsetPair VO = FindValueInExprValueMap(S, InsertPt); + Value *V = VO.first; if (!V) V = visit(S); + else if (VO.second) { + V = Builder.CreateSub(V, VO.second); + } // Remember the expanded value for this SCEV at this location. // @@ -1914,7 +1919,7 @@ Value *SCEVExpander::findExistingExpansi // Use expand's logic which is used for reusing a previous Value in // ExprValueMap. - if (Value *Val = FindValueInExprValueMap(S, At)) + if (Value *Val = FindValueInExprValueMap(S, At).first) return Val; // There is potential to make this significantly smarter, but this simple Modified: projects/ipsec/lib/libthr/thread/thr_exit.c ============================================================================== --- projects/ipsec/lib/libthr/thread/thr_exit.c Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/lib/libthr/thread/thr_exit.c Thu Jan 26 15:37:53 2017 (r312817) @@ -240,9 +240,6 @@ _pthread_exit_mask(void *status, sigset_ #ifdef PIC thread_uw_init(); -#endif /* PIC */ - -#ifdef PIC if (uwl_forcedunwind != NULL) { #else if (_Unwind_ForcedUnwind != NULL) { Modified: projects/ipsec/libexec/rtld-elf/aarch64/reloc.c ============================================================================== --- projects/ipsec/libexec/rtld-elf/aarch64/reloc.c Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/libexec/rtld-elf/aarch64/reloc.c Thu Jan 26 15:37:53 2017 (r312817) @@ -184,6 +184,18 @@ rtld_tlsdesc_handle(struct tls_data *tls return (tlsdesc->index); } +static void +reloc_tlsdesc(Obj_Entry *obj, const Elf_Rela *rela, Elf_Addr *where) +{ + if (ELF_R_SYM(rela->r_info) == 0) { + where[0] = (Elf_Addr)_rtld_tlsdesc; + where[1] = obj->tlsoffset + rela->r_addend; + } else { + where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic; + where[1] = (Elf_Addr)reloc_tlsdesc_alloc(obj, rela); + } +} + /* * Process the PLT relocations. */ @@ -204,14 +216,7 @@ reloc_plt(Obj_Entry *obj) *where += (Elf_Addr)obj->relocbase; break; case R_AARCH64_TLSDESC: - if (ELF_R_SYM(rela->r_info) == 0) { - where[0] = (Elf_Addr)_rtld_tlsdesc; - where[1] = obj->tlsoffset + rela->r_addend; - } else { - where[0] = (Elf_Addr)_rtld_tlsdesc_dynamic; - where[1] = (Elf_Addr)reloc_tlsdesc_alloc(obj, - rela); - } + reloc_tlsdesc(obj, rela, where); break; default: _rtld_error("Unknown relocation type %u in PLT", @@ -362,6 +367,9 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry return (-1); } break; + case R_AARCH64_TLSDESC: + reloc_tlsdesc(obj, rela, where); + break; case R_AARCH64_TLS_TPREL64: def = find_symdef(symnum, obj, &defobj, flags, cache, lockstate); Modified: projects/ipsec/share/misc/committers-ports.dot ============================================================================== --- projects/ipsec/share/misc/committers-ports.dot Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/share/misc/committers-ports.dot Thu Jan 26 15:37:53 2017 (r312817) @@ -195,6 +195,7 @@ philip [label="Philip Paeps\nphilip@Free rafan [label="Rong-En Fan\nrafan@FreeBSD.org\n2006/06/23"] rakuco [label="Raphael Kubo da Costa\nrakuco@FreeBSD.org\n2011/08/22"] rene [label="Rene Ladan\nrene@FreeBSD.org\n2010/04/11"] +rezny [label="Matthew Rezny\nrezny@FreeBSD.org\n2017/01/09"] riggs [label="Thomas Zander\nriggs@FreeBSD.org\n2014/01/09"] rm [label="Ruslan Makhmatkhanov\nrm@FreeBSD.org\n2011/11/06"] rnoland [label="Robert Noland\nrnoland@FreeBSD.org\n2008/07/21"] @@ -370,6 +371,7 @@ erwin -> simon feld -> brnrd feld -> junovitch +feld -> rezny fjoe -> danfe fjoe -> flo @@ -595,6 +597,7 @@ swills -> feld swills -> jrm swills -> milki swills -> pclin +swills -> rezny swills -> robak swills -> rpaulo swills -> tz Modified: projects/ipsec/share/misc/scsi_modes ============================================================================== --- projects/ipsec/share/misc/scsi_modes Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/share/misc/scsi_modes Thu Jan 26 15:37:53 2017 (r312817) @@ -478,4 +478,17 @@ {Current Write Speed Supported (kBps)} i2 }; +0x1d "Timeout and Protect" { + {Reserved} *i2 + {Reserved} *t4 + {G3Enable} t1 + {TMOE} t1 + {DISP} t1 + {SWPP} t1 + {Reserved} *i1 + {Group 1 Minimum Timeout} i2 + {Group 2 Minimum Timeout} i2 + {Group 3 Timeout} i2 +}; + 0x00 "Vendor-Specific"; Modified: projects/ipsec/sys/arm/arm/pmap-v6.c ============================================================================== --- projects/ipsec/sys/arm/arm/pmap-v6.c Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/sys/arm/arm/pmap-v6.c Thu Jan 26 15:37:53 2017 (r312817) @@ -1160,11 +1160,11 @@ pmap_bootstrap(vm_offset_t firstaddr) * Local CMAP1/CMAP2 are used for zeroing and copying pages. * Local CMAP2 is also used for data cache cleaning. */ - pc = pcpu_find(curcpu); + pc = get_pcpu(); mtx_init(&pc->pc_cmap_lock, "SYSMAPS", NULL, MTX_DEF); SYSMAP(caddr_t, pc->pc_cmap1_pte2p, pc->pc_cmap1_addr, 1); SYSMAP(caddr_t, pc->pc_cmap2_pte2p, pc->pc_cmap2_addr, 1); - SYSMAP(vm_offset_t, unused, pc->pc_qmap_addr, 1); + SYSMAP(vm_offset_t, pc->pc_qmap_pte2p, pc->pc_qmap_addr, 1); /* * Crashdump maps. @@ -1217,6 +1217,7 @@ pmap_init_reserved_pages(void) panic("%s: unable to allocate KVA", __func__); pc->pc_cmap1_pte2p = pt2map_entry(pages); pc->pc_cmap2_pte2p = pt2map_entry(pages + PAGE_SIZE); + pc->pc_qmap_pte2p = pt2map_entry(pages + (PAGE_SIZE * 2)); pc->pc_cmap1_addr = (caddr_t)pages; pc->pc_cmap2_addr = (caddr_t)(pages + PAGE_SIZE); pc->pc_qmap_addr = pages + (PAGE_SIZE * 2); @@ -1584,7 +1585,7 @@ pmap_pt2pg_zero(vm_page_t m) * to sync it even if the sync is only DSB. */ sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap2_pte2p = pc->pc_cmap2_pte2p; mtx_lock(&pc->pc_cmap_lock); if (pte2_load(cmap2_pte2p) != 0) @@ -5661,7 +5662,7 @@ pmap_page_set_memattr(vm_page_t m, vm_me if (ma != oma) { pa = VM_PAGE_TO_PHYS(m); sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap2_pte2p = pc->pc_cmap2_pte2p; mtx_lock(&pc->pc_cmap_lock); if (pte2_load(cmap2_pte2p) != 0) @@ -5754,7 +5755,7 @@ pmap_zero_page(vm_page_t m) struct pcpu *pc; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap2_pte2p = pc->pc_cmap2_pte2p; mtx_lock(&pc->pc_cmap_lock); if (pte2_load(cmap2_pte2p) != 0) @@ -5781,7 +5782,7 @@ pmap_zero_page_area(vm_page_t m, int off struct pcpu *pc; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap2_pte2p = pc->pc_cmap2_pte2p; mtx_lock(&pc->pc_cmap_lock); if (pte2_load(cmap2_pte2p) != 0) @@ -5811,7 +5812,7 @@ pmap_copy_page(vm_page_t src, vm_page_t struct pcpu *pc; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap1_pte2p = pc->pc_cmap1_pte2p; cmap2_pte2p = pc->pc_cmap2_pte2p; mtx_lock(&pc->pc_cmap_lock); @@ -5846,7 +5847,7 @@ pmap_copy_pages(vm_page_t ma[], vm_offse int cnt; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap1_pte2p = pc->pc_cmap1_pte2p; cmap2_pte2p = pc->pc_cmap2_pte2p; mtx_lock(&pc->pc_cmap_lock); @@ -5885,34 +5886,34 @@ pmap_copy_pages(vm_page_t ma[], vm_offse vm_offset_t pmap_quick_enter_page(vm_page_t m) { + struct pcpu *pc; pt2_entry_t *pte2p; - vm_offset_t qmap_addr; critical_enter(); - qmap_addr = PCPU_GET(qmap_addr); - pte2p = pt2map_entry(qmap_addr); + pc = get_pcpu(); + pte2p = pc->pc_qmap_pte2p; KASSERT(pte2_load(pte2p) == 0, ("%s: PTE2 busy", __func__)); pte2_store(pte2p, PTE2_KERN_NG(VM_PAGE_TO_PHYS(m), PTE2_AP_KRW, vm_page_pte2_attr(m))); - return (qmap_addr); + return (pc->pc_qmap_addr); } void pmap_quick_remove_page(vm_offset_t addr) { + struct pcpu *pc; pt2_entry_t *pte2p; - vm_offset_t qmap_addr; - qmap_addr = PCPU_GET(qmap_addr); - pte2p = pt2map_entry(qmap_addr); + pc = get_pcpu(); + pte2p = pc->pc_qmap_pte2p; - KASSERT(addr == qmap_addr, ("%s: invalid address", __func__)); + KASSERT(addr == pc->pc_qmap_addr, ("%s: invalid address", __func__)); KASSERT(pte2_load(pte2p) != 0, ("%s: PTE2 not in use", __func__)); pte2_clear(pte2p); - tlb_flush(qmap_addr); + tlb_flush(pc->pc_qmap_addr); critical_exit(); } @@ -6212,7 +6213,7 @@ pmap_dcache_wb_pou(vm_paddr_t pa, vm_siz ("%s: not on single page", __func__)); sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap2_pte2p = pc->pc_cmap2_pte2p; mtx_lock(&pc->pc_cmap_lock); if (pte2_load(cmap2_pte2p) != 0) @@ -6477,7 +6478,7 @@ pmap_zero_page_check(vm_page_t m) struct pcpu *pc; sched_pin(); - pc = pcpu_find(curcpu); + pc = get_pcpu(); cmap2_pte2p = pc->pc_cmap2_pte2p; mtx_lock(&pc->pc_cmap_lock); if (pte2_load(cmap2_pte2p) != 0) Modified: projects/ipsec/sys/arm/conf/ARMADA38X ============================================================================== --- projects/ipsec/sys/arm/conf/ARMADA38X Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/sys/arm/conf/ARMADA38X Thu Jan 26 15:37:53 2017 (r312817) @@ -60,6 +60,9 @@ device scbus device pass device da +# SATA +device ahci + # I2C device iic device iicbus Modified: projects/ipsec/sys/arm/include/pcpu.h ============================================================================== --- projects/ipsec/sys/arm/include/pcpu.h Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/sys/arm/include/pcpu.h Thu Jan 26 15:37:53 2017 (r312817) @@ -54,15 +54,13 @@ struct vmspace; caddr_t pc_cmap1_addr; \ caddr_t pc_cmap2_addr; \ vm_offset_t pc_qmap_addr; \ - void *pc_qmap_pte; \ + void *pc_qmap_pte2p; \ unsigned int pc_dbreg[32]; \ int pc_dbreg_cmd; \ char __pad[27] #else #define PCPU_MD_FIELDS \ - vm_offset_t qmap_addr; \ - void *pc_qmap_pte; \ - char __pad[149] + char __pad[157] #endif #ifdef _KERNEL Modified: projects/ipsec/sys/arm/mv/armada38x/files.armada38x ============================================================================== --- projects/ipsec/sys/arm/mv/armada38x/files.armada38x Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/sys/arm/mv/armada38x/files.armada38x Thu Jan 26 15:37:53 2017 (r312817) @@ -1,6 +1,8 @@ # $FreeBSD$ arm/mv/mpic.c standard +arm/mv/armada/thermal.c optional fdt + arm/mv/armada38x/armada38x.c standard arm/mv/armada38x/armada38x_mp.c optional smp arm/mv/armada38x/pmsu.c standard Modified: projects/ipsec/sys/arm/mv/files.mv ============================================================================== --- projects/ipsec/sys/arm/mv/files.mv Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/sys/arm/mv/files.mv Thu Jan 26 15:37:53 2017 (r312817) @@ -29,5 +29,6 @@ dev/uart/uart_dev_ns8250.c optional uart dev/uart/uart_dev_snps.c optional uart dev/usb/controller/ehci_mv.c optional ehci dev/usb/controller/xhci_mv.c optional xhci +dev/ahci/ahci_mv_fdt.c optional ahci kern/kern_clocksource.c standard Modified: projects/ipsec/sys/arm/mv/mv_common.c ============================================================================== --- projects/ipsec/sys/arm/mv/mv_common.c Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/sys/arm/mv/mv_common.c Thu Jan 26 15:37:53 2017 (r312817) @@ -98,6 +98,7 @@ static void decode_win_usb_setup(u_long) static void decode_win_usb3_setup(u_long); static void decode_win_eth_setup(u_long); static void decode_win_sata_setup(u_long); +static void decode_win_ahci_setup(u_long); static void decode_win_idma_setup(u_long); static void decode_win_xor_setup(u_long); @@ -107,6 +108,7 @@ static void decode_win_usb3_dump(u_long) static void decode_win_eth_dump(u_long base); static void decode_win_idma_dump(u_long base); static void decode_win_xor_dump(u_long base); +static void decode_win_ahci_dump(u_long base); static int fdt_get_ranges(const char *, void *, int, int *, int *); #ifdef SOC_MV_ARMADA38X @@ -139,6 +141,7 @@ static struct soc_node_spec soc_nodes[] { "mrvl,ge", &decode_win_eth_setup, &decode_win_eth_dump }, { "mrvl,usb-ehci", &decode_win_usb_setup, &decode_win_usb_dump }, { "marvell,armada-380-xhci", &decode_win_usb3_setup, &decode_win_usb3_dump }, + { "marvell,armada-380-ahci", &decode_win_ahci_setup, &decode_win_ahci_dump }, { "mrvl,sata", &decode_win_sata_setup, NULL }, { "mrvl,xor", &decode_win_xor_setup, &decode_win_xor_dump }, { "mrvl,idma", &decode_win_idma_setup, &decode_win_idma_dump }, @@ -146,7 +149,12 @@ static struct soc_node_spec soc_nodes[] { NULL, NULL, NULL }, }; -struct fdt_pm_mask_entry fdt_pm_mask_table[] = { +struct fdt_pm_mask_entry { + char *compat; + uint32_t mask; +}; + +static struct fdt_pm_mask_entry fdt_pm_mask_table[] = { { "mrvl,ge", CPU_PM_CTRL_GE(0) }, { "mrvl,ge", CPU_PM_CTRL_GE(1) }, { "mrvl,usb-ehci", CPU_PM_CTRL_USB(0) }, @@ -660,6 +668,11 @@ WIN_REG_BASE_IDX_RD(win_sata, cr, MV_WIN WIN_REG_BASE_IDX_RD(win_sata, br, MV_WIN_SATA_BASE); WIN_REG_BASE_IDX_WR(win_sata, cr, MV_WIN_SATA_CTRL); WIN_REG_BASE_IDX_WR(win_sata, br, MV_WIN_SATA_BASE); +#if defined(SOC_MV_ARMADA38X) +WIN_REG_BASE_IDX_RD(win_sata, sz, MV_WIN_SATA_SIZE); +WIN_REG_BASE_IDX_WR(win_sata, sz, MV_WIN_SATA_SIZE); +#endif + #ifndef SOC_MV_DOVE WIN_REG_IDX_RD(ddr, br, MV_WIN_DDR_BASE, MV_DDR_CADR_BASE) WIN_REG_IDX_RD(ddr, sz, MV_WIN_DDR_SIZE, MV_DDR_CADR_BASE) @@ -1999,6 +2012,75 @@ decode_win_sata_setup(u_long base) } } +#ifdef SOC_MV_ARMADA38X +/* + * Configure AHCI decoding windows + */ +static void +decode_win_ahci_setup(u_long base) +{ + uint32_t br, cr, sz; + int i, j; + + for (i = 0; i < MV_WIN_SATA_MAX; i++) { + win_sata_cr_write(base, i, 0); + win_sata_br_write(base, i, 0); + win_sata_sz_write(base, i, 0); + } + + for (i = 0; i < MV_WIN_DDR_MAX; i++) { + if (ddr_is_active(i)) { + cr = (ddr_attr(i) << IO_WIN_ATTR_SHIFT) | + (ddr_target(i) << IO_WIN_TGT_SHIFT) | + IO_WIN_ENA_MASK; + br = ddr_base(i); + sz = (ddr_size(i) - 1) & + (IO_WIN_SIZE_MASK << IO_WIN_SIZE_SHIFT); + + /* Use first available SATA window */ + for (j = 0; j < MV_WIN_SATA_MAX; j++) { + if (win_sata_cr_read(base, j) & IO_WIN_ENA_MASK) + continue; + + /* BASE is set to DRAM base (0x00000000) */ + win_sata_br_write(base, j, br); + /* CTRL targets DRAM ctrl with 0x0E or 0x0D */ + win_sata_cr_write(base, j, cr); + /* SIZE is set to 16MB - max value */ + win_sata_sz_write(base, j, sz); + break; + } + } + } +} + +static void +decode_win_ahci_dump(u_long base) +{ + int i; + + for (i = 0; i < MV_WIN_SATA_MAX; i++) + printf("SATA window#%d: cr 0x%08x, br 0x%08x, sz 0x%08x\n", i, + win_sata_cr_read(base, i), win_sata_br_read(base, i), + win_sata_sz_read(base,i)); +} + +#else +/* + * Provide dummy functions to satisfy the build + * for SoC's not equipped with AHCI controller + */ +static void +decode_win_ahci_setup(u_long base) +{ +} + +static void +decode_win_ahci_dump(u_long base) +{ +} +#endif + static int decode_win_sata_valid(void) { @@ -2172,6 +2254,10 @@ fdt_win_setup(void) soc_node = &soc_nodes[i]; + /* Setup only for enabled devices */ + if (ofw_bus_node_status_okay(child) == 0) + continue; + if (!ofw_bus_node_is_compatible(child,soc_node->compat)) continue; Modified: projects/ipsec/sys/arm/mv/mvwin.h ============================================================================== --- projects/ipsec/sys/arm/mv/mvwin.h Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/sys/arm/mv/mvwin.h Thu Jan 26 15:37:53 2017 (r312817) @@ -324,9 +324,16 @@ #define MV_PCIE_CONTROL (0x1a00) #define MV_PCIE_ROOT_CMPLX (1 << 1) +#if defined(SOC_MV_ARMADA38X) +#define MV_WIN_SATA_CTRL(n) (0x10 * (n) + 0x60) +#define MV_WIN_SATA_BASE(n) (0x10 * (n) + 0x64) +#define MV_WIN_SATA_SIZE(n) (0x10 * (n) + 0x68) +#define MV_WIN_SATA_MAX 4 +#else #define MV_WIN_SATA_CTRL(n) (0x10 * (n) + 0x30) #define MV_WIN_SATA_BASE(n) (0x10 * (n) + 0x34) #define MV_WIN_SATA_MAX 4 +#endif #if defined(SOC_MV_ARMADA38X) #define MV_BOOTROM_MEM_ADDR 0xFFF00000 Modified: projects/ipsec/sys/cam/cam_iosched.c ============================================================================== --- projects/ipsec/sys/cam/cam_iosched.c Thu Jan 26 13:50:09 2017 (r312816) +++ projects/ipsec/sys/cam/cam_iosched.c Thu Jan 26 15:37:53 2017 (r312817) @@ -112,7 +112,7 @@ typedef enum { bandwidth, /* Limit bandwidth to the drive */ limiter_max } io_limiter; - + static const char *cam_iosched_limiter_names[] = { "none", "queue_depth", "iops", "bandwidth" }; @@ -131,7 +131,7 @@ typedef int l_tick_t(struct iop_stats *) * Called to see if the limiter thinks this IOP can be allowed to * proceed. If so, the limiter assumes that the while IOP proceeded * and makes any accounting of it that's needed. - */ + */ typedef int l_iop_t(struct iop_stats *, struct bio *); /* @@ -157,8 +157,7 @@ static l_tick_t cam_iosched_bw_tick; static l_iop_t cam_iosched_bw_caniop; static l_iop_t cam_iosched_bw_iop; -struct limswitch -{ +struct limswitch { l_init_t *l_init; l_tick_t *l_tick; l_iop_t *l_iop; @@ -195,8 +194,7 @@ struct limswitch }, }; -struct iop_stats -{ +struct iop_stats { /* * sysctl state for this subnode. */ @@ -212,7 +210,6 @@ struct iop_stats int current; /* Current rate limiter */ int l_value1; /* per-limiter scratch value 1. */ int l_value2; /* per-limiter scratch value 2. */ - /* * Debug information about counts of I/Os that have gone through the @@ -223,7 +220,7 @@ struct iop_stats int total; /* Total for all time -- wraps */ int in; /* number queued all time -- wraps */ int out; /* number completed all time -- wraps */ - + /* * Statistics on different bits of the process. */ @@ -251,8 +248,7 @@ typedef enum { static const char *cam_iosched_control_type_names[] = { "set_max", "read_latency" }; -struct control_loop -{ +struct control_loop { /* * sysctl state for this subnode. */ @@ -272,8 +268,7 @@ struct control_loop #endif -struct cam_iosched_softc -{ +struct cam_iosched_softc { struct bio_queue_head bio_queue; struct bio_queue_head trim_queue; /* scheduler flags < 16, user flags >= 16 */ @@ -385,7 +380,7 @@ cam_iosched_limiter_iodone(struct iop_st static int cam_iosched_qd_iop(struct iop_stats *ios, struct bio *bp) { - + if (ios->current <= 0 || ios->pending < ios->current) return 0; @@ -395,7 +390,7 @@ cam_iosched_qd_iop(struct iop_stats *ios static int cam_iosched_qd_caniop(struct iop_stats *ios, struct bio *bp) { - + if (ios->current <= 0 || ios->pending < ios->current) return 0; @@ -405,7 +400,7 @@ cam_iosched_qd_caniop(struct iop_stats * static int cam_iosched_qd_iodone(struct iop_stats *ios, struct bio *bp) { - + if (ios->current <= 0 || ios->pending != ios->current) return 0; @@ -773,7 +768,7 @@ cam_iosched_limiter_sysctl(SYSCTL_HANDLE struct cam_iosched_softc *isc; int value, i, error; const char *p; - + ios = arg1; isc = ios->softc; value = ios->limiter; @@ -781,7 +776,7 @@ cam_iosched_limiter_sysctl(SYSCTL_HANDLE p = "UNKNOWN"; else p = cam_iosched_limiter_names[value]; - + strlcpy(buf, p, sizeof(buf)); error = sysctl_handle_string(oidp, buf, sizeof(buf), req); if (error != 0 || req->newptr == NULL) @@ -819,7 +814,7 @@ cam_iosched_control_type_sysctl(SYSCTL_H struct cam_iosched_softc *isc; int value, i, error; const char *p; - + clp = arg1; isc = clp->softc; value = clp->type; @@ -827,7 +822,7 @@ cam_iosched_control_type_sysctl(SYSCTL_H p = "UNKNOWN"; else p = cam_iosched_control_type_names[value]; - + strlcpy(buf, p, sizeof(buf)); error = sysctl_handle_string(oidp, buf, sizeof(buf), req); if (error != 0 || req->newptr == NULL) @@ -852,7 +847,7 @@ cam_iosched_sbintime_sysctl(SYSCTL_HANDL sbintime_t value; int error; uint64_t us; - + value = *(sbintime_t *)arg1; us = (uint64_t)value / SBT_1US; snprintf(buf, sizeof(buf), "%ju", (intmax_t)us); @@ -969,7 +964,7 @@ cam_iosched_cl_sysctl_init(struct cam_io struct sysctl_oid_list *n; struct sysctl_ctx_list *ctx; struct control_loop *clp; - + clp = &isc->cl; clp->sysctl_tree = SYSCTL_ADD_NODE(&isc->sysctl_ctx, SYSCTL_CHILDREN(isc->sysctl_tree), OID_AUTO, "control", @@ -1007,7 +1002,7 @@ cam_iosched_cl_sysctl_fini(struct contro printf("can't remove iosched sysctl control loop context\n"); } #endif - + /* * Allocate the iosched structure. This also insulates callers from knowing * sizeof struct cam_iosched_softc. @@ -1069,7 +1064,6 @@ cam_iosched_fini(struct cam_iosched_soft callout_drain(&isc->ticker); isc->flags &= ~ CAM_IOSCHED_FLAG_CALLOUT_ACTIVE; } - #endif free(isc, M_CAMSCHED); } *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***