1. 31 7月, 2014 2 次提交
  2. 30 7月, 2014 1 次提交
    • R
      fix terminal control ioctl constants for sh · cbb609b3
      Rich Felker 提交于
      this commit changes the names to match the kernel names, exposing
      under the normal names the "old" versions which work with a smaller
      termios structure compatible with the userspace structure, and
      renaming the "new" versions with "2" on the end like the kernel has.
      
      this fixes spurious warnings "Unsupported ioctl: cmd=0x802c542a" from
      qemu-sh4 and should be more correct anyway, since our userspace
      termios structure does not have meaningful information in the part
      which the kernel would be interpreting as speeds with the new ioctl.
      cbb609b3
  3. 28 7月, 2014 3 次提交
    • R
      remove unused a_cas_l from or1k atomic.h · c0284b37
      Rich Felker 提交于
      this follows the same logic as in the previous commit for other archs.
      c0284b37
    • R
      clean up unused and inconsistent atomics in arch dirs · 90e51e45
      Rich Felker 提交于
      the a_cas_l, a_swap_l, a_swap_p, and a_store_l operations were
      probably used a long time ago when only i386 and x86_64 were
      supported. as other archs were added, support for them was
      inconsistent, and they are obviously not in use at present. having
      them around potentially confuses readers working on new ports, and the
      type-punning hacks and inconsistent use of types in their definitions
      is not a style I wish to perpetuate in the source tree, so removing
      them seems appropriate.
      90e51e45
    • R
      fix insufficient synchronization in sh atomic asm · c394763d
      Rich Felker 提交于
      while other usage I've seen only has the synco instruction after the
      atomic operation, I cannot find any documentation indicating that this
      is correct. certainly all stores before the atomic need to have been
      synchronized before the atomic operation takes place.
      c394763d
  4. 21 7月, 2014 2 次提交
  5. 20 7月, 2014 10 次提交
    • R
      fix mips struct stat dev_t members for big endian · f61be1f8
      Rich Felker 提交于
      the mips version of this structure on the kernel side wrongly has
      32-bit type rather than 64-bit type. fortunately there is adjacent
      padding to bring it up to 64 bits, and on little-endian, this allows
      us to treat the adjacent kernel st_dev and st_pad0[0] as as single
      64-bit dev_t. however, on big endian, such treatment results in the
      upper and lower 32-bit parts of the dev_t value being swapped. for the
      purpose of just comparing st_dev values this did not break anything,
      but it precluded actually processing the device numbers as major/minor
      values.
      
      since the broken kernel behavior that needs to be worked around is
      isolated to one arch, I put the workarounds in syscall_arch.h rather
      than adding a stat fixup path in the common code. on little endian
      mips, the added code optimizes out completely.
      
      the changes necessary were incompatible with the way the __asm_syscall
      macro was factored so I just removed it and flattened the individual
      __syscallN functions. this arguably makes the code easier to read and
      understand, anyway.
      f61be1f8
    • R
      fix or1k atomic store · cec33b2c
      Rich Felker 提交于
      at the very least, a compiler barrier is required no matter what, and
      that was missing. current or1k implementations have strong ordering,
      but this is not guaranteed as part of the ISA, so some sort of
      synchronizing operation is necessary.
      
      in principle we should use l.msync, but due to misinterpretation of
      the spec, it was wrongly treated as an optional instruction and is not
      supported by some implementations. if future kernels trap it and treat
      it as a nop (rather than illegal instruction) when the
      hardware/emulator does not support it, we could consider using it.
      
      in the absence of l.msync support, the l.lwa/l.swa instructions, which
      are specified to have a built-in l.msync, need to be used. the easiest
      way to use them to implement atomic store is to perform an atomic swap
      and throw away the result. using compare-and-swap would be lighter,
      and would probably be sufficient for all actual usage cases, but
      checking this is difficult and error-prone:
      
      with store implemented in terms of swap, it's guaranteed that, when
      another atomic operation is performed at the same time as the store,
      either the result of the store followed by the other operation, or
      just the store (clobbering the other operation's result) is seen. if
      store were implemented in terms of cas, there are cases where this
      invariant would fail to hold, and we would need detailed rules for the
      situations in which the store operation is well-defined.
      cec33b2c
    • R
      fix missing barriers in powerpc atomic store · 522a0de2
      Rich Felker 提交于
      522a0de2
    • R
      fix microblaze atomic store · 884cc0c7
      Rich Felker 提交于
      as far as I can tell, microblaze is strongly ordered, but this does
      not seem to be well-documented and the assumption may need revisiting.
      even with strong ordering, however, a volatile C assignment is not
      sufficient to implement atomic store, since it does not preclude
      reordering by the compiler with respect to non-volatile stores and
      loads.
      
      simply flanking a C store with empty volatile asm blocks with memory
      clobbers would achieve the desired result, but is likely to result in
      worse code generation, since the address and value for the store may
      need to be spilled. actually writing the store in asm, so that there's
      only one asm block, should give optimal code generation while
      satisfying the requirement for having a compiler barrier.
      884cc0c7
    • R
      1456b7ae
    • R
      fix missing barrier instructions in mips atomic asm · bcad4843
      Rich Felker 提交于
      previously I had wrongly assumed the ll/sc instructions also provided
      memory synchronization; apparently they do not. this commit adds sync
      instructions before and after each atomic operation and changes the
      atomic store to simply use sync before and after a plain store, rather
      than a useless compare-and-swap.
      bcad4843
    • R
      use memory constraints for mips atomic asm · a294f539
      Rich Felker 提交于
      despite lacking the semantic content that the asm accesses the
      pointed-to object rather than just using its address as a value, the
      mips asm was not actually broken. the asm blocks were declared
      volatile, meaning that the compiler must treat them as having unknown
      side effects.
      
      however changing the asm to use memory constraints is desirable not
      just from a semantic correctness and consistency standpoint, but also
      produces better code. the compiler is able to use base/offset
      addressing expressions for the atomic object's address rather than
      having to load the address into a single register. this improves
      access to global locks in static libc, and access to non-zero-offset
      atomic fields in synchronization primitives, etc.
      a294f539
    • R
      fix build breakage from ppc asm constraints change · bb3a3bef
      Rich Felker 提交于
      due to a mistake in my testing procedure, the changes in the previous
      commit were not correctly tested and wrongly assumed to be valid. the
      lwarx and stwcx. instructions do not accept general ppc memory address
      expressions and thus the argument associated with the memory
      constraint cannot be used directly.
      
      instead, the memory constraint can be left as an argument that the asm
      does not actually use, and the address can be provided in a separate
      register constraint.
      bb3a3bef
    • R
      remove cruft from microblaze atomic.h · 94252dd3
      Rich Felker 提交于
      94252dd3
    • R
      fix broken constraints for powerpc atomic cas asm · 7fdae458
      Rich Felker 提交于
      the register constraint for the address to be accessed did not convey
      that the asm can access the pointed-to object. as far as the compiler
      could tell, the result of the asm was just a pure function of the
      address and the values passed in, and thus the asm could be hoisted
      out of loops or omitted entirely if the result was not used.
      7fdae458
  6. 19 7月, 2014 2 次提交
    • R
      fix microblaze definition of struct stat · d69ab5b3
      Rich Felker 提交于
      the erroneous definition was missed because with works with qemu
      user-level emulation, which also has the wrong definition. the actual
      kernel uses the asm-generic generic definition.
      d69ab5b3
    • S
      add or1k (OpenRISC 1000) architecture port · 200d1547
      Stefan Kristiansson 提交于
      With the exception of a fenv implementation, the port is fully featured.
      The port has been tested in or1ksim, the golden reference functional
      simulator for OpenRISC 1000.
      It passes all libc-test tests (except the math tests that
      requires a fenv implementation).
      
      The port assumes an or1k implementation that has support for
      atomic instructions (l.lwa/l.swa).
      
      Although it passes all the libc-test tests, the port is still
      in an experimental state, and has yet experienced very little
      'real-world' use.
      200d1547
  7. 30 6月, 2014 1 次提交
    • R
      fix regression in mips dynamic linker · 2d8cc92a
      Rich Felker 提交于
      this issue caused the address of functions in shared libraries to
      resolve to their PLT thunks in the main program rather than their
      correct addresses. it was observed causing crashes, though the
      mechanism of the crash was not thoroughly investigated. since the
      issue is very subtle, it calls for some explanation:
      
      on all well-behaved archs, GOT entries that belong to the PLT use a
      special relocation type, typically called JMP_SLOT, so that the
      dynamic linker can avoid having the jump destinations for the PLT
      resolve to PLT thunks themselves (they also provide a definition for
      the symbol, which must be used whenever the address of the function is
      taken so that all DSOs see the same address).
      
      however, the traditional mips PIC ABI lacked such a JMP_SLOT
      relocation type, presumably because, due to the way PIC works, the
      address of the PLT thunk was never needed and could always be ignored.
      
      prior to commit adf94c19, the mips
      version of reloc.h contained a hack that caused all symbol lookups to
      be treated like JMP_SLOT, inhibiting undefined symbols from ever being
      used to resolve symbolic relocations. this hack goes all the way back
      to commit babf8201, when the mips
      dynamic linker was first made usable.
      
      during the recent refactoring to eliminate arch-specific relocation
      processing (commit adf94c19), this
      hack was overlooked and no equivalent functionality was provided in
      the new code.
      
      fixing the problem is not as simple as adding back an equivalent hack,
      since there is now also a "non-PIC ABI" that can be used for the main
      executable, which actually does use a PLT. the closest thing to
      official documentation I could find for this ABI is nonpic.txt,
      attached to Message-ID: 20080701202236.GA1534@caradoc.them.org, which
      can be found in the gcc mailing list archives and elsewhere. per this
      document, undefined symbols corresponding to PLT thunks have the
      STO_MIPS_PLT bit set in the symbol's st_other field. thus, I have
      added an arch-specific rule for mips, applied at the find_sym level
      rather than the relocation level, to reject undefined symbols with the
      STO_MIPS_PLT bit clear.
      
      the previous hack of treating all mips relocations as JMP_SLOT-like,
      rather than rejecting the unwanted symbols in find_sym, probably also
      caused dlsym to wrongly return PLT thunks in place of the correct
      address of a function under at least some conditions. this should now
      be fixed, at least for global-scope symbol lookups.
      2d8cc92a
  8. 20 6月, 2014 1 次提交
  9. 19 6月, 2014 1 次提交
  10. 18 6月, 2014 3 次提交
    • R
      refactor to remove arch-specific relocation code from dynamic linker · adf94c19
      Rich Felker 提交于
      this was one of the main instances of ugly code duplication: all archs
      use basically the same types of relocations, but roughly equivalent
      logic was duplicated for each arch to account for the different naming
      and numbering of relocation types and variation in whether REL or RELA
      records are used.
      
      as an added bonus, both REL and RELA are now supported on all archs,
      regardless of which is used by the standard toolchain.
      adf94c19
    • R
      fix powerpc dynamic linker thread-pointer-relative relocations · 94cf991b
      Rich Felker 提交于
      processing of R_PPC_TPREL32 was ignoring the addend provided by the
      RELA-style relocation and instead using the inline value as the
      addend. this presumably broke dynamic-linked access to initial TLS in
      cases where the addend was nonzero.
      94cf991b
    • R
      multiple fixes to sh (superh) dynamic linker relocations · f4cc2760
      Rich Felker 提交于
      the following issues are fixed:
      
      - R_SH_REL32 was adding the load address of the module being relocated
        to the result. this seems to have been a mistake in the original
        port, since it does not match other dynamic linker implementations
        and since adding a difference between two addresses (the symbol
        value and the relocation address) to a load address does not make
        sense.
      
      - R_SH_TLS_DTPMOD32 was wrongly accepting an inline addend (i.e. using
        += rather than = on *reloc_addr) which makes no sense; addition is
        not an operation that's defined on module ids.
      
      - R_SH_TLS_DTPOFF32 and R_SH_TLS_TPOFF32 were wrongly using inline
        addends rather than the RELA-provided addends.
      
      in addition, handling of R_SH_GLOB_DAT, R_SH_JMP_SLOT, and R_SH_DIR32
      are merged to all honor the addend. the first two should not need it
      for correct usage generated by toolchains, but other dynamic linkers
      allow addends here, and it simplifies the code anyway.
      
      these issues were spotted while reviewing the code for the purpose of
      refactoring this part of the dynamic linker. no testing was performed.
      f4cc2760
  11. 16 6月, 2014 1 次提交
    • R
      dynamic linker: permit error returns from arch-specific reloc function · bfa09700
      Rich Felker 提交于
      the immediate motivation is supporting TLSDESC relocations which
      require allocation and thus may fail (unless we pre-allocate), but
      this mechanism should also be used for throwing an error on
      unsupported or invalid relocation types, and perhaps in certain cases,
      for reporting when a relocation is not satisfiable.
      bfa09700
  12. 06 6月, 2014 1 次提交
  13. 31 5月, 2014 1 次提交
    • S
      add sched_{get,set}attr syscall numbers and SCHED_DEADLINE macro · fd9571e2
      Szabolcs Nagy 提交于
      linux 3.14 introduced sched_getattr and sched_setattr syscalls in
      commit d50dde5a10f305253cbc3855307f608f8a3c5f73
      
      and the related SCHED_DEADLINE scheduling policy in
      commit aab03e05e8f7e26f51dee792beddcb5cca9215a5
      
      but struct sched_attr "extended scheduling parameters data structure"
      is not yet exported to userspace (necessary for using the syscalls)
      so related uapi definitions are not added yet.
      fd9571e2
  14. 30 5月, 2014 1 次提交
    • S
      fix for broken kernel side RLIM_INFINITY on mips · 8258014f
      Szabolcs Nagy 提交于
      On 32 bit mips the kernel uses -1UL/2 to mark RLIM_INFINITY (and
      this is the definition in the userspace api), but since it is in
      the middle of the valid range of limits and limits are often
      compared with relational operators, various kernel side logic is
      broken if larger than -1UL/2 limits are used. So we truncate the
      limits to -1UL/2 in get/setrlimit and prlimit.
      
      Even if the kernel side logic consistently treated -1UL/2 as greater
      than any other limit value, there wouldn't be any clean workaround
      that allowed using large limits:
      * using -1UL/2 as RLIM_INFINITY in userspace would mean different
      infinity value for get/setrlimt and prlimit (where infinity is always
      -1ULL) and userspace logic could break easily (just like the kernel
      is broken now) and more special case code would be needed for mips.
      * translating -1UL/2 kernel side value to -1ULL in userspace would
      mean that -1UL/2 limit cannot be set (eg. -1UL/2+1 had to be passed
      to the kernel instead).
      8258014f
  15. 01 5月, 2014 2 次提交
  16. 18 4月, 2014 1 次提交
  17. 16 4月, 2014 3 次提交
    • R
      add working vdso clock_gettime support, including static linking · 58e75db4
      Rich Felker 提交于
      the vdso symbol lookup code is based on the original 2011 patch by
      Nicholas J. Kain, with some streamlining, pointer arithmetic fixes,
      and one symbol version matching fix.
      
      on the consumer side (clock_gettime), per-arch macros for the
      particular symbol name and version to lookup are added in
      syscall_arch.h, and no vdso code is pulled in on archs which do not
      define these macros. at this time, vdso is enabled only on x86_64.
      
      the vdso support at the dynamic linker level is no longer useful to
      libc, but is left in place for the sake of debuggers (which may need
      the vdso in the link map to find its functions) and possibly use with
      dlsym.
      58e75db4
    • S
      fix RLIMIT_ constants for mips · fcea534e
      Szabolcs Nagy 提交于
      The mips arch is special in that it uses different RLIMIT_
      numbers than other archs, so allow bits/resource.h to override
      the default RLIMIT_ numbers (empty on all archs except mips).
      Reported by orc.
      fcea534e
    • R
      add namespace-protected name for sysinfo function · de20a8ff
      Rich Felker 提交于
      it will be needed to implement some things in sysconf, and the syscall
      can't easily be used directly because the x32 syscall uses the wrong
      structure layout. the l (uncreative, for "linux") prefix is used since
      the symbol name __sysinfo is already taken for AT_SYSINFO from the aux
      vector.
      
      the way the x32 override of this function works is also changed to be
      simpler and avoid the useless jump instruction.
      de20a8ff
  18. 15 4月, 2014 1 次提交
    • R
      use dmb barrier instruction for atomics on arm v7 · 3933fdd5
      Rich Felker 提交于
      aside from potentially offering better performance, this change is
      needed since the old coprocessor-based approach to barriers is
      deprecated in arm v7, and some compilers/assemblers issue errors when
      using the deprecated instruction for v7 targets.
      3933fdd5
  19. 07 4月, 2014 2 次提交
    • R
      fix arm atomic asm register constraint · efe07b0f
      Rich Felker 提交于
      the "m" constraint could give a memory reference with an offset that's
      not compatible with ldrex/strex, so the arm-specific "Q" constraint is
      needed instead.
      efe07b0f
    • R
      use inline atomics and thread pointer on arm models supporting them · 1974bffa
      Rich Felker 提交于
      this is perhaps not the optimal implementation; a_cas still compiles
      to nested loops due to the different interface contracts of the kuser
      helper cas function (whose contract this patch implements) and the
      a_cas function (whose contract mimics the x86 cmpxchg). fixing this
      may be possible, but it's more complicated and thus deferred until a
      later time.
      
      aside from improving performance and code size, this patch also
      provides a means of producing binaries which can run on hardened
      kernels where the kuser helpers have been disabled. however, at
      present this requires producing binaries for armv6k or later, which
      will not run on older cpus. a real solution to the problem of kernels
      that omit the kuser helpers would be runtime detection, so that
      universal binaries which run on all arm cpu models can also be
      compatible with all kernel hardening profiles. robust detection
      however is a much harder problem, and will be addressed at a later
      time.
      1974bffa
  20. 03 4月, 2014 1 次提交
    • R
      fix microblaze syscall register clobbers · 91d5aa06
      Rich Felker 提交于
      the kernel entry point for syscalls on microblaze nominally saves and
      restores all registers, and testing on qemu always worked since qemu
      behaves this way too. however, the real kernel treats r3:r4 as a
      potential 64-bit return value from the syscall function, and copies
      both over top of the saved registers before returning to userspace.
      thus, we need to treat r4 as always-clobbered.
      91d5aa06