Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
xen.33142
65f079ab-x86-mm-speculation-barriers-in-open-co...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 65f079ab-x86-mm-speculation-barriers-in-open-coded.patch of Package xen.33142
# Commit 42a572a38e22a97d86a4b648a22597628d5b42e4 # Date 2024-03-12 15:50:04 +0000 # Author Roger Pau Monné <roger.pau@citrix.com> # Committer Andrew Cooper <andrew.cooper3@citrix.com> x86/mm: add speculation barriers to open coded locks Add a speculation barrier to the clearly identified open-coded lock taking functions. Note that the memory sharing page_lock() replacement (_page_lock()) is left as-is, as the code is experimental and not security supported. This is part of XSA-453 / CVE-2024-2193 Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> --- a/xen/arch/x86/include/asm/mm.h +++ b/xen/arch/x86/include/asm/mm.h @@ -393,7 +393,9 @@ const struct platform_bad_page *get_plat * The use of PGT_locked in mem_sharing does not collide, since mem_sharing is * only supported for hvm guests, which do not have PV PTEs updated. */ -int page_lock(struct page_info *page); +int page_lock_unsafe(struct page_info *page); +#define page_lock(pg) lock_evaluate_nospec(page_lock_unsafe(pg)) + void page_unlock(struct page_info *page); void put_page_type(struct page_info *page); --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -2033,7 +2033,7 @@ static inline bool current_locked_page_n #define current_locked_page_ne_check(x) true #endif -int page_lock(struct page_info *page) +int page_lock_unsafe(struct page_info *page) { unsigned long x, nx; @@ -2094,7 +2094,7 @@ void page_unlock(struct page_info *page) * l3t_lock(), so to avoid deadlock we must avoid grabbing them in * reverse order. */ -static void l3t_lock(struct page_info *page) +static always_inline void l3t_lock(struct page_info *page) { unsigned long x, nx; @@ -2103,6 +2103,8 @@ static void l3t_lock(struct page_info *p cpu_relax(); nx = x | PGT_locked; } while ( cmpxchg(&page->u.inuse.type_info, x, nx) != x ); + + block_lock_speculation(); } static void l3t_unlock(struct page_info *page)
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor