• Alexander Gordeev's avatar
    s390/smp: rework absolute lowcore access · 7d06fed7
    Alexander Gordeev authored
    Temporary unsetting of the prefix page in memcpy_absolute() routine
    poses a risk of executing code path with unexpectedly disabled prefix
    page. This rework avoids the prefix page uninstalling and disabling
    of normal and machine check interrupts when accessing the absolute
    zero memory.
    
    Although memcpy_absolute() routine can access the whole memory, it is
    only used to update the absolute zero lowcore. This rework therefore
    introduces a new mechanism for the absolute zero lowcore access and
    scraps memcpy_absolute() routine for good.
    
    Instead, an area is reserved in the virtual memory that is used for
    the absolute lowcore access only. That area holds an array of 8KB
    virtual mappings - one per CPU. Whenever a CPU is brought online, the
    corresponding item is mapped to the real address of the previously
    installed prefix page.
    
    The absolute zero lowcore access works like this: a CPU calls the
    new primitive get_abs_lowcore() to obtain its 8KB mapping as a
    pointer to the struct lowcore. Virtual address references to that
    pointer get translated to the real addresses of the prefix page,
    which in turn gets swapped with the absolute zero memory addresses
    due to prefixing. Once the pointer is not needed it must be released
    with put_abs_lowcore() primitive:
    
    	struct lowcore *abs_lc;
    	unsigned long flags;
    
    	abs_lc = get_abs_lowcore(&flags);
    	abs_lc->... = ...;
    	put_abs_lowcore(abs_lc, flags);
    
    To ensure the described mechanism works large segment- and region-
    table entries must be avoided for the 8KB mappings. Failure to do
    so results in usage of Region-Frame Absolute Address (RFAA) or
    Segment-Frame Absolute Address (SFAA) large page fields. In that
    case absolute addresses would be used to address the prefix page
    instead of the real ones and the prefixing would get bypassed.
    Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
    7d06fed7
abs_lowcore.h 503 Bytes