On Fri, Mar 08, 2019 at 03:02:09PM -0600, Josh Poimboeuf wrote:
> > +static const char *uaccess_safe_builtin[] = {
> > +   /* KASAN */
> 
> A short comment would be good here, something describing why a function
> might be added to the list.

There is; but I'm thinking it might be too short?

> > +   "memset_orig", /* XXX why not memset_erms */
> > +   "__memset",
> > +   "kasan_poison_shadow",
> > +   "kasan_unpoison_shadow",
> > +   "__asan_poison_stack_memory",
> > +   "__asan_unpoison_stack_memory",

Those are gone.

> > +   "kasan_report",

That is the main kasan_report function, and is for, as the comment says:
kasan :-)

> > +   "check_memory_region",

for __asan_{load,store}N

> > +   /* KASAN out-of-line */
> > +   "__asan_loadN_noabort",
> > +   "__asan_load1_noabort",
> > +   "__asan_load2_noabort",
> > +   "__asan_load4_noabort",
> > +   "__asan_load8_noabort",
> > +   "__asan_load16_noabort",
> > +   "__asan_storeN_noabort",
> > +   "__asan_store1_noabort",
> > +   "__asan_store2_noabort",
> > +   "__asan_store4_noabort",
> > +   "__asan_store8_noabort",
> > +   "__asan_store16_noabort",

These, are, again as the comment suggests, the out-of-line KASAN ABI
calls.

> > +   /* KASAN in-line */
> > +   "__asan_report_load_n_noabort",
> > +   "__asan_report_load1_noabort",
> > +   "__asan_report_load2_noabort",
> > +   "__asan_report_load4_noabort",
> > +   "__asan_report_load8_noabort",
> > +   "__asan_report_load16_noabort",
> > +   "__asan_report_store_n_noabort",
> > +   "__asan_report_store1_noabort",
> > +   "__asan_report_store2_noabort",
> > +   "__asan_report_store4_noabort",
> > +   "__asan_report_store8_noabort",
> > +   "__asan_report_store16_noabort",

The in-line KASAN ABI

Also, can I just say that {load,store}N vs {load,store}_n bugs the
hell out of me?

> > +   /* KCOV */
> > +   "write_comp_data",

the logger function

> > +   "__sanitizer_cov_trace_pc",
> > +   "__sanitizer_cov_trace_const_cmp1",
> > +   "__sanitizer_cov_trace_const_cmp2",
> > +   "__sanitizer_cov_trace_const_cmp4",
> > +   "__sanitizer_cov_trace_const_cmp8",
> > +   "__sanitizer_cov_trace_cmp1",
> > +   "__sanitizer_cov_trace_cmp2",
> > +   "__sanitizer_cov_trace_cmp4",
> > +   "__sanitizer_cov_trace_cmp8",

KCOV ABI

> > +   /* UBSAN */
> > +   "ubsan_type_mismatch_common",

implementation

> > +   "__ubsan_handle_type_mismatch",
> > +   "__ubsan_handle_type_mismatch_v1",

UBSAN ABI

> > +   /* misc */
> > +   "csum_partial_copy_generic",
> > +   "__memcpy_mcsafe",
> > +   "ftrace_likely_update", /* CONFIG_TRACE_BRANCH_PROFILING */
> > +   NULL
> > +};

> > +           func = find_symbol_by_name(file->elf, *name);
> 
> This won't work if the function name changes due to IPA optimizations.
> I assume these are all global functions so maybe it's fine?

With one or two exceptions, yep.

> These gotos make my head spin.  Again I would much prefer a small amount
> of code duplication over this.

I didn't think the code was that bad once you see the end result, but
sure, I can try something else.

> > +++ b/tools/objtool/special.c
> > @@ -42,6 +42,7 @@
> >  #define ALT_NEW_LEN_OFFSET 11
> >  
> >  #define X86_FEATURE_POPCNT (4*32+23)
> > +#define X86_FEATURE_SMAP   (9*32+20)
> >  
> >  struct special_entry {
> >     const char *sec;
> > @@ -107,8 +108,15 @@ static int get_alt_entry(struct elf *elf
> >              * It has been requested that we don't validate the !POPCNT
> >              * feature path which is a "very very small percentage of
> >              * machines".
> > +            *
> > +            * Also, unconditionally enable SMAP; this avoids seeing paths
> > +            * that pass through the STAC alternative and through the CLAC
> > +            * NOPs.
> 
> Why is this a problem?

'obvious' violation?

STAC; .... RET; # an AC=1 leak

.... CLAC; # spurious CLAC

If we do the STAC we must also do the CLAC. If we don't do the STAC we
must also not do the CLAC.


> > +            *
> > +            * XXX: We could do this for all binary NOP/single-INSN
> > +            * alternatives.
> 
> Same question here.

In general, validating NOPs isn't too interesting, so all NOP/INSN
binary alternatives could be forced on.

> >              */
> > -           if (feature == X86_FEATURE_POPCNT)
> > +           if (feature == X86_FEATURE_POPCNT || feature == 
> > X86_FEATURE_SMAP)
> >                     alt->skip_orig = true;
> >     }

I've actually changed this to depend on --uaccess, when set we force on
FEATURE_SMAP, otherwise we force off.

Reply via email to