On Sat, Mar 31, 2012 at 12:18:27PM +0200, Mark Kettenis wrote:
> > Date: Sat, 31 Mar 2012 01:47:18 +0300
> > From: Paul Irofti <[email protected]>
> > 
> > After the report from a few weeks ago I went ahead and fixed most (if
> > not all) of the signed integer usages in the AML parser.
> > 
> > Please have a look at this diff, test it thoroughly and comment/okay it.
> 
> So you ran into the same issue that -1 has this special meaning where
> I decided to go for a minimal fix instead.  The C integer promotion
> rules always confuse me (I think otto@ is the only person in the world
> who actually understands them).  The way you sprinkled (signed) and
> (unsigned) in the code makes me very suspicious since I don't think it
> does what you think it does.  Now using -1 as a magic value for an
> unsigned type isn't entirely uncommon, and the "traditional" way to
> handle this has always been to cast the -1 constant to the appropriate
> type.  So...

Yes, the casting was bad and I fixed that in my tree. I just need to add
some more type changes (aml_value!length) and I'll send a new diff.

> 
> > Index: dev/acpi/dsdt.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/acpi/dsdt.c,v
> > retrieving revision 1.193
> > diff -u -p -r1.193 dsdt.c
> > --- dev/acpi/dsdt.c 15 Mar 2012 18:36:53 -0000      1.193
> > +++ dev/acpi/dsdt.c 30 Mar 2012 22:45:15 -0000
> > @@ -895,7 +892,7 @@ aml_val2int(struct aml_value *rval)
> >  
> >  /* Sets value into LHS: lhs must already be cleared */
> >  struct aml_value *
> > -_aml_setvalue(struct aml_value *lhs, int type, int64_t ival, const void 
> > *bval)
> > +_aml_setvalue(struct aml_value *lhs, int type, u_int64_t ival, const void 
> > *bval)
> >  {
> >     memset(&lhs->_, 0x0, sizeof(lhs->_));
> >  
> > @@ -923,7 +920,7 @@ _aml_setvalue(struct aml_value *lhs, int
> >                     memcpy(lhs->v_buffer, bval, ival);
> >             break;
> >     case AML_OBJTYPE_STRING:
> > -           if (ival == -1)
> > +           if ((signed)ival == -1)
> 
> +             if (ival == (u_int64_t)-1)
> 
> >                     ival = strlen((const char *)bval);
> >             lhs->length = ival;
> >             lhs->v_string = (char *)acpi_os_malloc(ival+1);
> > @@ -1451,11 +1448,11 @@ static char osstring[] = "Macrosift Wind
> >  struct aml_defval {
> >     const char              *name;
> >     int                     type;
> > -   int64_t                 ival;
> > +   u_int64_t               ival;
> >     const void              *bval;
> >     struct aml_value        **gval;
> >  } aml_defobj[] = {
> > -   { "_OS_", AML_OBJTYPE_STRING, -1, osstring },
> > +   { "_OS_", AML_OBJTYPE_STRING, (unsigned)-1, osstring },
> 
> and there should be no need to add a cast here.

Reply via email to