Re: git: 108de784513d - main - Redefine CLOCK_BOOTTIME to alias CLOCK_MONOTONIC, not CLOCK_UPTIME
- Reply: Cy Schubert : "Re: git: 108de784513d - main - Redefine CLOCK_BOOTTIME to alias CLOCK_MONOTONIC, not CLOCK_UPTIME"
- In reply to: Cy Schubert : "Re: git: 108de784513d - main - Redefine CLOCK_BOOTTIME to alias CLOCK_MONOTONIC, not CLOCK_UPTIME"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 01 Jun 2024 13:51:37 UTC
On Sat, Jun 1, 2024 at 9:31 AM Cy Schubert <Cy.Schubert@cschubert.com> wrote: > In message > <CANCZdfpMvorgKYx6pCL7_q6BW3AqZSDwryKHg_cV+yt_E-FbOQ@mail.gmail.c > om> > , Warner Losh writes: > > --0000000000000d72080619d34a39 > > Content-Type: text/plain; charset="UTF-8" > > Content-Transfer-Encoding: quoted-printable > > > > On Sat, Jun 1, 2024, 4:37=E2=80=AFAM Nuno Teixeira <eduardo@freebsd.org> > wr= > > ote: > > > > > Hello, > > > > > > Having issues building graphics/mesa-dri: > > > > > > ../src/intel/common/xe/intel_gem.c:72:9: error: duplicate case value > '4' > > > 72 | case CLOCK_BOOTTIME: > > > | ^ > > > /usr/include/sys/_clock_id.h:81:25: note: expanded from macro > > > 'CLOCK_BOOTTIME' > > > 81 | #define CLOCK_BOOTTIME CLOCK_MONOTONIC > > > | ^ > > > /usr/include/sys/_clock_id.h:56:26: note: expanded from macro > > > 'CLOCK_MONOTONIC' > > > 56 | #define CLOCK_MONOTONIC 4 > > > | ^ > > > ../src/intel/common/xe/intel_gem.c:66:9: note: previous case defined > here > > > 66 | case CLOCK_MONOTONIC: > > > | ^ > > > /usr/include/sys/_clock_id.h:56:26: note: expanded from macro > > > 'CLOCK_MONOTONIC' > > > 56 | #define CLOCK_MONOTONIC 4 > > > | ^ > > > 1 error generated. > > > > > > > Mesa needs to be updated to not assume these are distinct values. > > You should be able to resolve this with, > > --- src/intel/common/xe/intel_gem.c.orig 2024-05-22 > 09:48:39.000000000 -0700 > +++ src/intel/common/xe/intel_gem.c 2024-06-01 06:28:22.268439000 -0700 > @@ -69,8 +69,10 @@ > #endif > case CLOCK_REALTIME: > #ifdef CLOCK_BOOTTIME > +#if CLOCK_BOOTTIME != CLOCK_MONOTONIC > case CLOCK_BOOTTIME: > #endif > +#endif > #ifdef CLOCK_TAI > case CLOCK_TAI: > #endif > Yea, that should do it. I was going to look at this when I got back from BSDcan (mostly because my talk is this morning), but thanks for beating me to it. I woke up grump and it was bugging me on the walk over to the conference I was a little short in my first reply, but since you proposed a fix, I feel less guilty... :) Thanks! Warner Warner Warner > -- > Cheers, > Cy Schubert <Cy.Schubert@cschubert.com> > FreeBSD UNIX: <cy@FreeBSD.org> Web: https://FreeBSD.org > NTP: <cy@nwtime.org> Web: https://nwtime.org > > e^(i*pi)+1=0 > > > > > > Warner > > > > > > > Thanks > > > > > > Warner Losh <imp@freebsd.org> escreveu (sexta, 31/05/2024 =C3=A0(s) > 15:47= > > ): > > > > > >> The branch main has been updated by imp: > > >> > > >> URL: > > >> > https://cgit.FreeBSD.org/src/commit/?id=3D108de784513d87bbe850e7b003a73e= > > 26b5b54caa > > >> > > >> commit 108de784513d87bbe850e7b003a73e26b5b54caa > > >> Author: Val Packett <val@packett.cool> > > >> AuthorDate: 2024-05-31 14:45:02 +0000 > > >> Commit: Warner Losh <imp@FreeBSD.org> > > >> CommitDate: 2024-05-31 14:45:02 +0000 > > >> > > >> Redefine CLOCK_BOOTTIME to alias CLOCK_MONOTONIC, not CLOCK_UPTIME > > >> > > >> The suspend-awareness situation with monotonic clocks across > platfor= > > ms > > >> is kind of a mess, let's try not making it worse. > > >> > > >> On Linux, CLOCK_MONOTONIC does NOT count suspended time, and > > >> CLOCK_BOOTTIME was introduced to INCLUDE suspended time. > > >> > > >> On OpenBSD, CLOCK_MONOTONIC DOES count suspended time, and > > >> CLOCK_UPTIME > > >> was introduced to EXCLUDE suspended time. > > >> > > >> On macOS, it's the same as OpenBSD, but with CLOCK_UPTIME_RAW. > > >> > > >> Right now, we do not have a monotonic clock that counts suspended > > >> time. > > >> We have CLOCK_UPTIME as a distinct ID alias, and CLOCK_BOOTTIME > as a > > >> preprocessor alias, both being effectively `CLOCK_MONOTONIC` for > now= > > . > > >> > > >> When we introduce a suspend-aware clock in the future, it would > make= > > a > > >> lot more sense to do it the OpenBSD/macOS way, i.e. to make > > >> CLOCK_MONOTONIC include suspended time and make CLOCK_UPTIME > exclude > > >> it, > > >> because that's what the name CLOCK_UPTIME implies: a deviation > from > > >> the > > >> default intended for the uptime command to allow it to only show > the > > >> time the system was actually up and not suspended. > > >> > > >> Let's change the define right now to make sure software using the > > >> define > > >> would not end up using the ID of the wrong clock in the future, > and > > >> fix > > >> the IDs in the Linux compat code to match the expected changes > too. > > >> > > >> See https://bugzilla.mozilla.org/show_bug.cgi?id=3D1824084 > > >> for more discussion. > > >> > > >> Fixes: 155f15118a77 ("clock_gettime: Add Linux aliases > for > > >> CLOCK_*") > > >> Fixes: 25ada637362d ("Map Linux CLOCK_BOOTTIME to native > > >> CLOCK_UPTIME.") > > >> Sponsored by: https://www.patreon.com/valpackett > > >> Reviewed by: kib, imp > > >> Differential Revision: https://reviews.freebsd.org/D39270 > > >> --- > > >> sys/compat/linux/linux_time.c | 6 +++--- > > >> sys/sys/_clock_id.h | 2 +- > > >> 2 files changed, 4 insertions(+), 4 deletions(-) > > >> > > >> diff --git a/sys/compat/linux/linux_time.c > b/sys/compat/linux/linux_time= > > .c > > >> index e9e5cf075210..f4dd26dd3d2a 100644 > > >> --- a/sys/compat/linux/linux_time.c > > >> +++ b/sys/compat/linux/linux_time.c > > >> @@ -287,7 +287,7 @@ linux_to_native_clockid(clockid_t *n, clockid_t l) > > >> *n =3D CLOCK_REALTIME; > > >> break; > > >> case LINUX_CLOCK_MONOTONIC: > > >> - *n =3D CLOCK_MONOTONIC; > > >> + *n =3D CLOCK_UPTIME; > > >> break; > > >> case LINUX_CLOCK_PROCESS_CPUTIME_ID: > > >> *n =3D CLOCK_PROCESS_CPUTIME_ID; > > >> @@ -300,10 +300,10 @@ linux_to_native_clockid(clockid_t *n, clockid_t > l) > > >> break; > > >> case LINUX_CLOCK_MONOTONIC_COARSE: > > >> case LINUX_CLOCK_MONOTONIC_RAW: > > >> - *n =3D CLOCK_MONOTONIC_FAST; > > >> + *n =3D CLOCK_UPTIME_FAST; > > >> break; > > >> case LINUX_CLOCK_BOOTTIME: > > >> - *n =3D CLOCK_UPTIME; > > >> + *n =3D CLOCK_MONOTONIC; > > >> break; > > >> case LINUX_CLOCK_REALTIME_ALARM: > > >> case LINUX_CLOCK_BOOTTIME_ALARM: > > >> diff --git a/sys/sys/_clock_id.h b/sys/sys/_clock_id.h > > >> index 47a551428dc3..728346a0f0ab 100644 > > >> --- a/sys/sys/_clock_id.h > > >> +++ b/sys/sys/_clock_id.h > > >> @@ -78,7 +78,7 @@ > > >> * Linux compatible names. > > >> */ > > >> #if __BSD_VISIBLE > > >> -#define CLOCK_BOOTTIME CLOCK_UPTIME > > >> +#define CLOCK_BOOTTIME CLOCK_MONOTONIC > > >> #define CLOCK_REALTIME_COARSE CLOCK_REALTIME_FAST > > >> #define CLOCK_MONOTONIC_COARSE CLOCK_MONOTONIC_FAST > > >> #endif > > >> > > >> > > > > > > -- > > > Nuno Teixeira > > > FreeBSD UNIX: <eduardo@FreeBSD.org> Web: https://FreeBSD.org > > > > > > > --0000000000000d72080619d34a39 > > Content-Type: text/html; charset="UTF-8" > > Content-Transfer-Encoding: quoted-printable > > > > <div dir=3D"ltr"><div dir=3D"auto"><div><br><br><div > class=3D"gmail_quote">= > > <div dir=3D"ltr" class=3D"gmail_attr">On Sat, Jun 1, 2024, > 4:37=E2=80=AFAM = > > Nuno Teixeira <<a href=3D"mailto:eduardo@freebsd.org" > target=3D"_blank">= > > eduardo@freebsd.org</a>> wrote:<br></div><blockquote > class=3D"gmail_quot= > > e" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc > solid;padding-left:1ex">= > > <div dir=3D"ltr"><div>Hello,</div><div><br></div><div>Having issues > buildin= > > g > graphics/mesa-dri:</div><div><br></div><div>../src/intel/common/xe/intel_= > > gem.c:72:9: error: duplicate case value '4'<br>=C2=A0 =C2=A072 | > = > > =C2=A0 =C2=A0case CLOCK_BOOTTIME:<br>=C2=A0 =C2=A0 =C2=A0 | =C2=A0 > =C2=A0 = > > =C2=A0 =C2=A0 ^<br>/usr/include/sys/_clock_id.h:81:25: note: expanded > from = > > macro 'CLOCK_BOOTTIME'<br>=C2=A0 =C2=A081 | #define > CLOCK_BOOTTIME = > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0CLOCK_MONOTONIC<br>=C2=A0 =C2=A0 > =C2=A0 |= > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 > =C2= > > =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 > ^<br>/usr/include/sys/_clock_id.h:56= > > :26: note: expanded from macro 'CLOCK_MONOTONIC'<br>=C2=A0 > =C2=A056= > > | #define CLOCK_MONOTONIC =C2=A0 =C2=A0 =C2=A0 =C2=A0 4<br>=C2=A0 > =C2=A0 = > > =C2=A0 | =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 > =C2= > > =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 > ^<br>../src/intel/common/xe/i= > > ntel_gem.c:66:9: note: previous case defined here<br>=C2=A0 =C2=A066 | > =C2= > > =A0 =C2=A0case CLOCK_MONOTONIC:<br>=C2=A0 =C2=A0 =C2=A0 | =C2=A0 =C2=A0 > =C2= > > =A0 =C2=A0 ^<br>/usr/include/sys/_clock_id.h:56:26: note: expanded from > mac= > > ro 'CLOCK_MONOTONIC'<br>=C2=A0 =C2=A056 | #define > CLOCK_MONOTONIC = > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 4<br>=C2=A0 =C2=A0 =C2=A0 | =C2=A0 =C2=A0 > =C2= > > =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 > =C2=A0 = > > =C2=A0 =C2=A0 =C2=A0 ^<br>1 error > generated.</div></div></blockquote></div>= > > </div><div dir=3D"auto"><br></div><div dir=3D"auto"><div > class=3D"gmail_quo= > > te"><div>Mesa needs to be updated to not assume these are distinct > values.<= > > /div><div><br></div><div>Warner</div><div>=C2=A0</div><blockquote > class=3D"= > > gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc > solid;padding-= > > left:1ex"><div dir=3D"ltr"><div><font color=3D"#888888">Thanks<br > clear=3D"= > > all"></font></div><div></div></div><br><div class=3D"gmail_quote"><div > dir= > > =3D"ltr" class=3D"gmail_attr">Warner Losh <<a href=3D"mailto: > imp@freebsd= > > .org" rel=3D"noreferrer" target=3D"_blank">imp@freebsd.org</a>> > escreveu= > > (sexta, 31/05/2024 =C3=A0(s) 15:47):<br></div><blockquote > class=3D"gmail_q= > > uote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid > rgb(204,204,2= > > 04);padding-left:1ex">The branch main has been updated by imp:<br> > > <br> > > URL: <a href=3D" > https://cgit.FreeBSD.org/src/commit/?id=3D108de784513d87bbe= > > 850e7b003a73e26b5b54caa" rel=3D"noreferrer noreferrer" > target=3D"_blank">ht= > > tps:// > cgit.FreeBSD.org/src/commit/?id=3D108de784513d87bbe850e7b003a73e26b5b= > > 54caa</a><br> > > <br> > > commit 108de784513d87bbe850e7b003a73e26b5b54caa<br> > > Author:=C2=A0 =C2=A0 =C2=A0Val Packett <val@packett.cool><br> > > AuthorDate: 2024-05-31 14:45:02 +0000<br> > > Commit:=C2=A0 =C2=A0 =C2=A0Warner Losh <imp@FreeBSD.org><br> > > CommitDate: 2024-05-31 14:45:02 +0000<br> > > <br> > > =C2=A0 =C2=A0 Redefine CLOCK_BOOTTIME to alias CLOCK_MONOTONIC, not > CLOCK_U= > > PTIME<br> > > <br> > > =C2=A0 =C2=A0 The suspend-awareness situation with monotonic clocks > across = > > platforms<br> > > =C2=A0 =C2=A0 is kind of a mess, let's try not making it worse.<br> > > <br> > > =C2=A0 =C2=A0 On Linux, CLOCK_MONOTONIC does NOT count suspended time, > and<= > > br> > > =C2=A0 =C2=A0 CLOCK_BOOTTIME was introduced to INCLUDE suspended > time.<br> > > <br> > > =C2=A0 =C2=A0 On OpenBSD, CLOCK_MONOTONIC DOES count suspended time, and > CL= > > OCK_UPTIME<br> > > =C2=A0 =C2=A0 was introduced to EXCLUDE suspended time.<br> > > <br> > > =C2=A0 =C2=A0 On macOS, it's the same as OpenBSD, but with > CLOCK_UPTIME= > > _RAW.<br> > > <br> > > =C2=A0 =C2=A0 Right now, we do not have a monotonic clock that counts > suspe= > > nded time.<br> > > =C2=A0 =C2=A0 We have CLOCK_UPTIME as a distinct ID alias, and > CLOCK_BOOTTI= > > ME as a<br> > > =C2=A0 =C2=A0 preprocessor alias, both being effectively > `CLOCK_MONOTONIC` = > > for now.<br> > > <br> > > =C2=A0 =C2=A0 When we introduce a suspend-aware clock in the future, it > wou= > > ld make a<br> > > =C2=A0 =C2=A0 lot more sense to do it the OpenBSD/macOS way, i.e. to > make<b= > > r> > > =C2=A0 =C2=A0 CLOCK_MONOTONIC include suspended time and make > CLOCK_UPTIME = > > exclude it,<br> > > =C2=A0 =C2=A0 because that's what the name CLOCK_UPTIME implies: a > devi= > > ation from the<br> > > =C2=A0 =C2=A0 default intended for the uptime command to allow it to > only s= > > how the<br> > > =C2=A0 =C2=A0 time the system was actually up and not suspended.<br> > > <br> > > =C2=A0 =C2=A0 Let's change the define right now to make sure > software u= > > sing the define<br> > > =C2=A0 =C2=A0 would not end up using the ID of the wrong clock in the > futur= > > e, and fix<br> > > =C2=A0 =C2=A0 the IDs in the Linux compat code to match the expected > change= > > s too.<br> > > <br> > > =C2=A0 =C2=A0 See <a href=3D" > https://bugzilla.mozilla.org/show_bug.cgi?id= > > =3D1824084" rel=3D"noreferrer noreferrer" target=3D"_blank"> > https://bugzill= > > a.mozilla.org/show_bug.cgi?id=3D1824084</a><br> > > =C2=A0 =C2=A0 for more discussion.<br> > > <br> > > =C2=A0 =C2=A0 Fixes:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 155f15118a77 > ("= > > clock_gettime: Add Linux aliases for CLOCK_*")<br> > > =C2=A0 =C2=A0 Fixes:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 25ada637362d > ("= > > Map Linux CLOCK_BOOTTIME to native CLOCK_UPTIME.")<br> > > =C2=A0 =C2=A0 Sponsored by:=C2=A0 =C2=A0<a href=3D" > https://www.patreon.com/= > > valpackett" rel=3D"noreferrer noreferrer" target=3D"_blank"> > https://www.pat= > > reon.com/valpackett</a><br> > > =C2=A0 =C2=A0 Reviewed by:=C2=A0 =C2=A0 kib, imp<br> > > =C2=A0 =C2=A0 Differential Revision:=C2=A0 <a href=3D" > https://reviews.freeb= > > sd.org/D39270" rel=3D"noreferrer noreferrer" target=3D"_blank"> > https://revi= > > ews.freebsd.org/D39270</a><br> > > ---<br> > > =C2=A0sys/compat/linux/linux_time.c | 6 +++---<br> > > =C2=A0sys/sys/_clock_id.h=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| 2 > +-<br= > > > > > =C2=A02 files changed, 4 insertions(+), 4 deletions(-)<br> > > <br> > > diff --git a/sys/compat/linux/linux_time.c > b/sys/compat/linux/linux_time.c<= > > br> > > index e9e5cf075210..f4dd26dd3d2a 100644<br> > > --- a/sys/compat/linux/linux_time.c<br> > > +++ b/sys/compat/linux/linux_time.c<br> > > @@ -287,7 +287,7 @@ linux_to_native_clockid(clockid_t *n, clockid_t > l)<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *n =3D > CLOCK_REALTI= > > ME;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 case LINUX_CLOCK_MONOTONIC:<br> > > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*n =3D > CLOCK_MONOTO= > > NIC;<br> > > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*n =3D > CLOCK_UPTIME= > > ;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 case LINUX_CLOCK_PROCESS_CPUTIME_ID:<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *n =3D > CLOCK_PROCES= > > S_CPUTIME_ID;<br> > > @@ -300,10 +300,10 @@ linux_to_native_clockid(clockid_t *n, clockid_t > l)<br= > > > > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 case LINUX_CLOCK_MONOTONIC_COARSE:<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 case LINUX_CLOCK_MONOTONIC_RAW:<br> > > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*n =3D > CLOCK_MONOTO= > > NIC_FAST;<br> > > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*n =3D > CLOCK_UPTIME= > > _FAST;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 case LINUX_CLOCK_BOOTTIME:<br> > > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*n =3D > CLOCK_UPTIME= > > ;<br> > > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*n =3D > CLOCK_MONOTO= > > NIC;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 case LINUX_CLOCK_REALTIME_ALARM:<br> > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 case LINUX_CLOCK_BOOTTIME_ALARM:<br> > > diff --git a/sys/sys/_clock_id.h b/sys/sys/_clock_id.h<br> > > index 47a551428dc3..728346a0f0ab 100644<br> > > --- a/sys/sys/_clock_id.h<br> > > +++ b/sys/sys/_clock_id.h<br> > > @@ -78,7 +78,7 @@<br> > > =C2=A0 * Linux compatible names.<br> > > =C2=A0 */<br> > > =C2=A0#if __BSD_VISIBLE<br> > > -#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 CLOCK_BOOTTIME=C2=A0 =C2=A0 =C2=A0 > =C2= > > =A0 =C2=A0 CLOCK_UPTIME<br> > > +#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 CLOCK_BOOTTIME=C2=A0 =C2=A0 =C2=A0 > =C2= > > =A0 =C2=A0 CLOCK_MONOTONIC<br> > > =C2=A0#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 CLOCK_REALTIME_COARSE=C2=A0 > =C2=A0= > > CLOCK_REALTIME_FAST<br> > > =C2=A0#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 CLOCK_MONOTONIC_COARSE=C2=A0 > CLOCK= > > _MONOTONIC_FAST<br> > > =C2=A0#endif<br> > > <br> > > </blockquote></div><br clear=3D"all"><br><span > class=3D"gmail_signature_pre= > > fix">-- </span><br><div dir=3D"ltr" class=3D"gmail_signature"><div > dir=3D"l= > > tr"><div><font color=3D"#888888">Nuno > Teixeira</font></div><div><div><font = > > color=3D"#888888"> > > FreeBSD UNIX:=C2=A0 <eduardo@FreeBSD.org>=C2=A0 =C2=A0Web:=C2=A0 > <a h= > > ref=3D"https://FreeBSD.org" rel=3D"noreferrer noreferrer" > target=3D"_blank"= > > >https://FreeBSD.org</a><br></font></div></div></div></div> > > </blockquote></div></div></div> > > </div> > > > > --0000000000000d72080619d34a39-- > > > > >