extern char __smccc_workaround_1_smc[__SMCCC_WORKAROUND_1_SMC_SZ];
 
-/* Home-grown __this_cpu_{ptr,read} variants that always work at HYP */
+/*
+ * Home-grown __this_cpu_{ptr,read} variants that always work at HYP,
+ * provided that sym is really a *symbol* and not a pointer obtained from
+ * a data structure. As for SHIFT_PERCPU_PTR(), the creative casting keeps
+ * sparse quiet.
+ */
 #define __hyp_this_cpu_ptr(sym)                                                \
        ({                                                              \
-               void *__ptr = hyp_symbol_addr(sym);                     \
+               void *__ptr;                                            \
+               __verify_pcpu_ptr(&sym);                                \
+               __ptr = hyp_symbol_addr(sym);                           \
                __ptr += read_sysreg(tpidr_el2);                        \
-               (typeof(&sym))__ptr;                                    \
+               (typeof(sym) __kernel __force *)__ptr;                  \
         })
 
 #define __hyp_this_cpu_read(sym)                                       \