On Mon, Jan 22, 2024, Binbin Wu wrote: > +static inline bool lam_u48_active(void) > +{ > + return (read_cr3() & CR3_LAM_BITS_MASK) == X86_CR3_LAM_U48; > +} > + > +static inline bool lam_u57_active(void) > +{ > + return !!(read_cr3() & X86_CR3_LAM_U57); > +} Same comments as the supervisor patches. > +static void test_lam_user_mode(bool has_lam, u64 lam_mask, u64 mem, u64 mmio) > +{ > + unsigned r; > + bool raised_vector; > + unsigned long cr3 = read_cr3() & ~CR3_LAM_BITS_MASK; > + u64 flags = 0; > + > + if (is_la57()) > + flags |= FLAGS_LA57; > + > + if (has_lam) { > + if (lam_mask == LAM48_MASK) { > + r = write_cr3_safe(cr3 | X86_CR3_LAM_U48); > + report((r == 0) && lam_u48_active(), "Set LAM_U48"); !r is the preferred style > + } else { > + r = write_cr3_safe(cr3 | X86_CR3_LAM_U57); > + report((r == 0) && lam_u57_active(), "Set LAM_U57"); > + } > + } > + if (lam_u48_active() || lam_u57_active()) > + flags |= FLAGS_LAM_ACTIVE; > + > + run_in_user((usermode_func)test_ptr, GP_VECTOR, flags, lam_mask, mem, > + false, &raised_vector); Ah, this is why test_ptr() doesn't recompute things. Hrm. Ah, I think we can at least compute the mask dynamically, e.g. test_ptr() just need to know if LAM48 and/or LAM57 is enabled, right? > + run_in_user((usermode_func)test_ptr, GP_VECTOR, flags, lam_mask, mmio, > + true, &raised_vector); > +}