On July 27, 2022 12:48:29 AM GMT+02:00, Andrew Hewus Fresh <and...@afresh1.com> 
wrote:
>On Sun, Jul 24, 2022 at 10:34:04AM -0700, Andrew Hewus Fresh wrote:
>> On Sun, Jul 24, 2022 at 09:14:30AM -0700, Andrew Hewus Fresh wrote:
>> > On Sun, Jul 24, 2022 at 10:01:26AM -0600, Theo de Raadt wrote:
>> > > Jonathan Gray <j...@jsg.id.au> wrote:
>> > > 
>> > > > On Sun, Jul 24, 2022 at 08:05:26AM -0600, Theo de Raadt wrote:
>> > > > > Why not match on cpu0: .*Intel
>> > > > 
>> > > > I sent a diff a month ago with ^cpu0:*Intel(R)
>> > > > 
>> > > > semarie mentioned false positives as it could match another
>> > > > Intel device on another line on a non-Intel CPU
>> > > > 
>> > > > https://marc.info/?l=openbsd-tech&m=165579653107768&w=2

I think replacing '*' with '*([![:cntrl:]])' can be the droid your looking for.

/Alexander

>> > > 
>> > > Well, then fw_update should be fixed to not perform the match over
>> > > multiple lines.
>> > 
>> > I'm looking at fixing fw_update to match each line instead of the whole
>> > dmesg.  I'll try to get a patch out for that today.
>> 
>> This patch matches patterns against each line in the dmesg instead of
>> anchoring on newlines and matching against the entire string at once
>> anchored by newlines.  This would mean that ^cpu0:*Intel(R) would Just
>> Work.
>> 
>> The problem is that it's a little over 3 times slower on my laptop to do
>> the matching this way.
>
>
>As an example, on my alpha (that I admit to only keeping around because
>a 166MHz single processor machine that runs OpenBSD is useful for
>testing how things work on a slow machine), the current code runs and
>doesn't find any firmware in 5.5 seconds and with this patch it now
>takes 17.5 seconds.
>
>
>> If any ksh folks have tricks to speed that up,
>> I'd appreciate it.  I'll try to think about whether I can build a sed
>> program that will spit out matches.  Sadly at the moment, distracted by
>> a non-computer project that has been taking up all my free time.
>> Hopefully that will be finished in the next couple weeks though.
>> 
>> I think I could do some magic to replace the "^cpu:*Intel(R)" above with
>> "^cpu:*([!\n])Intel(R)" (although not with directly as ksh wouldn't
>> recognize it).  That would be annoying to implement though, but would
>> then still be able to do the faster single match.
>> 
>> 
>> --- fw_update.sh.orig        Sun Jul 24 10:07:40 2022
>> +++ fw_update.sh     Sun Jul 24 10:14:21 2022
>> @@ -168,21 +168,31 @@
>>  }
>>  
>>  firmware_in_dmesg() {
>> -    local _d _m _line _dmesgtail _last='' _nl=$( echo )
>> +    local _d _m _line _dmesgtail _last='' _oldifs="$IFS"
>>  
>> +    IFS='
>> +'
>>      # The dmesg can contain multiple boots, only look in the last one
>> -    _dmesgtail="$( echo ; sed -n 'H;/^OpenBSD/h;${g;p;}' 
>> /var/run/dmesg.boot )"
>> +    set -A _dmesgtail $( sed -n 'H;/^OpenBSD/h;${g;p;}' /var/run/dmesg.boot 
>> )
>> +    IFS="$_oldifs"
>>  
>>      grep -v '^[[:space:]]*#' "$FWPATTERNS" |
>>          while read -r _d _m; do
>>              [ "$_d" = "$_last" ] && continue
>> -            [ "$_m" ]             || _m="${_nl}${_d}[0-9] at "
>> -            [ "$_m" = "${_m#^}" ] || _m="${_nl}${_m#^}"
>> -
>> -            if [[ $_dmesgtail = *$_m* ]]; then
>> -                    echo "$_d"
>> -                    _last="$_d"
>> +            [ "$_m" ] || _m="^${_d}[0-9] at "
>> +            if [ "$_m" = "${_m#^}" ]; then
>> +                    _m="*$_m"
>> +            else
>> +                    _m="${_m#^}"
>>              fi
>> +
>> +            for _line in "${_dmesgtail[@]}"; do
>> +                    if [[ $_line = $_m* ]]; then
>> +                            echo "$_d"
>> +                            _last="$_d"
>> +                            break
>> +                    fi
>> +            done
>>          done
>>  }
>>  
>> 
>

Reply via email to