30 Aug, 2013

2 commits


14 Aug, 2013

13 commits

  • This change adds infrastructure (CONFIG_TILE_HVGLUE_TRACE) that
    provides C code wrappers for the calls the kernel makes to the Tilera
    hypervisor. This allows standard kernel infrastructure like FTRACE to
    be able to instrument hypervisor calls.

    To allow direct calls to the true API, we export their names with a
    leading underscore as well. This is important for the few contexts
    where we need to make hypervisor calls without touching the stack.

    As part of this change, we also switch from creating the symbols
    with linker magic to creating them with assembler magic. This lets
    us provide a symbol type and generally make them appear more as symbols
    and less as just random values in the Elf namespace.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • If ioreamp_prot() fails in ioremap_page_range() due to kernel memory
    exhaustion, we previously would leak a struct vm_struct.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • This change creates the framework for vDSO calls, makes the existing
    rt_sigreturn() mechanism use it, and adds a fast gettimeofday().
    Now that we need to expose the vDSO address to userspace, we add
    AT_SYSINFO_EHDR to the set of aux entries provided to userspace.
    (You can disable any extra vDSO support by booting with vdso=0,
    but the rt_sigreturn vDSO page will still be provided.)

    Note that glibc has supported the tile vDSO since release 2.17.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • The tile code notifies the simulator of new ET_EXEC objects starting
    to execute so that tracing code can properly annotate the objects.
    However, we didn't support ET_DYN executables like ld.so, so we
    didn't properly load symbols, etc. This change enables that support;
    we use a variant of the SIM_CONTROL_DLOPEN simulator notification
    that newer simulators will recognize and use to set the base address
    for the next SIM_CONTROL_OS_EXEC notification.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • First, don't re-enable interrupts blindly in the Linux trap handler.
    We already handle page faults this way; synchronous interrupts like
    ILL_TRANS will fire even when interrupts are disabled, and we don't
    want to re-enable interrupts in that case.

    For ILL_TRANS, we now pass the ILL_VA_PC reason into the trap handler
    so we can report it properly; this is the address that caused the
    illegal translation trap. We print the address as part of the
    pr_alert() message now if it's coming from the kernel.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • It's much easier to read register dumps if you read vertically
    rather than horizontally, since the register numbers line up
    and lead the eye down more than to the right.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • First, fix a bug in asm/unaligned.h; we need to just use the asm-generic
    unaligned.h so we properly choose endian-correct flavors.

    Second, keep the hv/hypervisor.h ABI fully "native" in the sense that
    we don't have __BIG_ENDIAN__ ifdefs there. Instead, we use macros in
    the head_NN.S assembly code to properly extract two 32-bit structure
    members from a 64-bit register holding the structure.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • This change adds support for CONFIG_PREEMPT (full kernel preemption).
    In addition to the core support, this change includes a number
    of places where we fix up uses of smp_processor_id() and per-cpu
    variables. I also eliminate the PAGE_HOME_HERE and PAGE_HOME_UNKNOWN
    values for page homing, as it turns out they weren't being used.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • Since it's a no-op on tile anyway, there's no reason to be calling
    it in tile-specific code.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • First, in huge_pte_offset(), we were erroneously checking
    pgd_present(), which is always true, rather than pud_present(),
    which is the thing that tells us if there is a top-level (L0) PTE.
    Fixing this means we properly look up huge page entries only when
    the Present bit is actually set in the PTE.

    Second, use the standard pte_alloc_map() instead of the hand-rolled
    pte_alloc_hugetlb() routine that basically was written to avoid
    worrying about CONFIG_HIGHPTE. However, we no longer plan to support
    HIGHPTE, so a separate routine was just unnecessary code duplication.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • Also, alphabetize the existing entries for tile.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • This change adds support for avoiding recursive backtracer crashes;
    we haven't seen this in practice other than when things are seriously
    corrupt, but it may help avoid losing the root cause of a crash.

    Also, don't abort kernel backtracers for invalid userspace PC's.
    If we do, we lose the ability to backtrace through a userspace
    call to a bad address above PAGE_OFFSET, even though that it can
    be perfectly reasonable to continue the backtrace in such a case.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • This change enables unaligned userspace memory access via a kernel
    fast path on tilegx. The kernel tracks user PC/instruction pairs
    per-thread using a direct-mapped cache in userspace. The cache
    maps those PC/instruction pairs to JIT'ed instruction sequences that
    load or store using byte-wide load store intructions and then
    synthesize 2-, 4- or 8-byte load or store results. Once an
    instruction has been seen to generate an unaligned access once,
    subsequent hits on that instruction typically require overhead
    of only around 50 cycles if cache and TLB is hot.

    We support the prctl() PR_GET_UNALIGN / PR_SET_UNALIGN sys call to
    enable or disable unaligned fixups on a per-process basis.

    To do this we pull some of the tilepro unaligned support out of the
    single_step.c file; tilepro uses instruction disassembly for both
    single-step and unaligned access support. Since tilegx actually has
    hardware singlestep support, though, it's cleaner to keep the tilegx
    unaligned access code in a separate file. While we're at it,
    properly rename the tilepro-specific types, etc., to have tilepro
    suffixes instead of generic tile suffixes.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     

13 Aug, 2013

5 commits

  • Pointed out by checkpatch. A few of the DEFINE() lines were
    properly written without backslash continuation; fix the rest.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • As specified, the test wasn't correct, and in any case it should
    be a BUILD_BUG_ON.

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • This change adds support for the "memmap" boot parameter similar
    to what x86 provides. The tile version supports "memmap=1G$5G",
    for example, as a way to reserve a 1 GB range starting at PA 5GB.
    The memory is reserved via bootmem during startup, and we create a
    suitable "struct resource" marked as "Reserved" so you can see the
    range reported by /proc/iomem. Up to 64 such regions can currently
    be reserved on the boot command line.

    We do not support the x86 options "memmap=nn@ss" (force some memory
    to be available at the given address) since it's pointless to try to
    have Linux use memory the Tilera hypervisor hasn't given it. We do
    not support "memmap=nn#ss" to add an ACPI range for later processing,
    since we don't support ACPI. We do not support "memmap=exactmap"
    since we don't support reading the e820 information from the BIOS
    like x86 does. I did add support for "memmap=nn" (and the synonym
    "mem=nn") which cap the highest PA value at "nn"; these are both
    just a synonym for the existing tile boot option "maxmem".

    Signed-off-by: Chris Metcalf

    Chris Metcalf
     
  • This change improves and cleans up the tile console.

    - We enable HVC_IRQ support on tilegx, with the addition of a new
    Tilera hypervisor API for tilegx to allow a console IPI. If IPI
    support is not available we fall back to the previous polling mode.

    - We simplify the earlyprintk code to use CON_BOOT and eliminate some
    of the other supporting earlyprintk code.

    - A new tile_console_write() primitive is used to send output to
    the console and is factored out of the hvc_tile driver.
    This lets us support a "sim_console" boot argument to allow using
    simulator hooks to send output to the "console" as a slightly
    faster alternative to emulating the hardware more directly.

    Signed-off-by: Chris Metcalf
    Acked-by: Greg Kroah-Hartman

    Chris Metcalf
     

07 Aug, 2013

15 commits


06 Aug, 2013

5 commits