25 Oct, 2006

2 commits

  • The Cell CPU timebase has an erratum. When reading the entire 64 bits
    of the timebase with one mftb instruction, there is a handful of cycles
    window during which one might read a value with the low order 32 bits
    already reset to 0x00000000 but the high order bits not yet incremeted
    by one. This fixes it by reading the timebase again until the low order
    32 bits is no longer 0. That might introduce occasional latencies if
    hitting mftb just at the wrong time, but no more than 70ns on a cell
    blade, and that was considered acceptable.

    Signed-off-by: Benjamin Herrenschmidt
    Acked-by: Olof Johansson
    Signed-off-by: Paul Mackerras

    Benjamin Herrenschmidt
     
  • This patch reworks the feature fixup mecanism so vdso's can be fixed up.
    The main issue was that the construct:

    .long label (or .llong on 64 bits)

    will not work in the case of a shared library like the vdso. It will
    generate an empty placeholder in the fixup table along with a reloc,
    which is not something we can deal with in the vdso.

    The idea here (thanks Alan Modra !) is to instead use something like:

    1:
    .long label - 1b

    That is, the feature fixup tables no longer contain addresses of bits of
    code to patch, but offsets of such code from the fixup table entry
    itself. That is properly resolved by ld when building the .so's. I've
    modified the fixup mecanism generically to use that method for the rest
    of the kernel as well.

    Another trick is that the 32 bits vDSO included in the 64 bits kernel
    need to have a table in the 64 bits format. However, gas does not
    support 32 bits code with a statement of the form:

    .llong label - 1b (Or even just .llong label)

    That is, it cannot emit the right fixup/relocation for the linker to use
    to assign a 32 bits address to an .llong field. Thus, in the specific
    case of the 32 bits vdso built as part of the 64 bits kernel, we are
    using a modified macro that generates:

    .long 0xffffffff
    .llong label - 1b

    Note that is assumes that the value is negative which is enforced by
    the .lds (those offsets are always negative as the .text is always
    before the fixup table and gas doesn't support emiting the reloc the
    other way around).

    Signed-off-by: Benjamin Herrenschmidt
    Signed-off-by: Paul Mackerras

    Benjamin Herrenschmidt
     

26 Apr, 2006

1 commit


12 Oct, 2005

1 commit

  • Interestingly enough, ppc32 had broken timekeeping for ages... It
    worked, but probably drifted a bit more than could be explained by the
    actual bad precision of the timebase calibration. We discovered that
    recently when somebody figured out that the common code was using
    CLOCK_TICK_RATE to correct the timekeeing, and ppc32 had a completely
    bogus value for it.

    This patch turns it into something saner. Probably not as good as doing
    something based on the actual timebase frequency precision but I'll
    leave that sort of math to others. This at least makes it better for
    the common HZ values.

    Signed-off-by: Benjamin Herrenschmidt
    Signed-off-by: Linus Torvalds

    Benjamin Herrenschmidt
     

09 Sep, 2005

1 commit

  • Merge a few asm-ppc and asm-ppc64 header files.
    Note: the merge of setup.h intentionally does not carry
    forward the m68k cruft. That means this patch continues
    to break the already broken amiga on the ppc32.

    Signed-off-by: Jon Loeliger
    Signed-off-by: Kumar Gala
    Signed-off-by: Paul Mackerras

    jdl@freescale.com