Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/include/asm.h

    r2f23341 r7a0359b  
    122122}
    123123
    124 /** Return base address of current memory stack.
    125  *
    126  * The memory stack is assumed to be STACK_SIZE / 2 long. Note that there is
    127  * also the RSE stack, which takes up the upper half of STACK_SIZE.
    128  * The memory stack must start on page boundary.
     124/** Return base address of current stack
     125 *
     126 * Return the base address of the current stack.
     127 * The stack is assumed to be STACK_SIZE long.
     128 * The stack must start on page boundary.
     129 *
    129130 */
    130131NO_TRACE static inline uintptr_t get_stack_base(void)
    131132{
    132         uint64_t value;
     133        uint64_t v;
     134       
     135        /*
     136         * I'm not sure why but this code inlines badly
     137         * in scheduler, resulting in THE shifting about
     138         * 16B and causing kernel panic.
     139         *
     140         * asm volatile (
     141         *     "and %[value] = %[mask], r12"
     142         *     : [value] "=r" (v)
     143         *     : [mask] "r" (~(STACK_SIZE - 1))
     144         * );
     145         * return v;
     146         *
     147         * The following code has the same semantics but
     148         * inlines correctly.
     149         *
     150         */
    133151       
    134152        asm volatile (
    135153                "mov %[value] = r12"
    136                 : [value] "=r" (value)
    137         );
    138        
    139         return (value & (~(STACK_SIZE / 2 - 1)));
     154                : [value] "=r" (v)
     155        );
     156       
     157        return (v & (~(STACK_SIZE - 1)));
    140158}
    141159
Note: See TracChangeset for help on using the changeset viewer.