[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Help on memchr() EGLIBC assembly code



On 07/13/2009 03:16 PM, Matt Turner forwarded:
The problem is that the memchr() function on alpha uses prefetch, which
can cause a page boundary to be crossed, while the standards (POSIX and
C99) says it should stop when a match is found.

That's not supposed to matter -- faults from prefetch are supposed to be ignored; see do_page_fault:

        /* As of EV6, a load into $31/$f31 is a prefetch, and never faults
           (or is suppressed by the PALcode).  Support that for older CPUs
           by ignoring such an instruction.  */
        if (cause == 0) {
                unsigned int insn;
                __get_user(insn, (unsigned int __user *)regs->pc);
                if ((insn >> 21 & 0x1f) == 0x1f &&
                    /* ldq ldl ldt lds ldg ldf ldwu ldbu */
                    (1ul << (insn >> 26) & 0x30f00001400ul)) {
                        regs->pc += 4;
                        return;
                }
        }

Can you figure out why that kernel code isn't working? I no longer have working alpha hw...


r~


Reply to: