kern/121504: [patch] Correctly set hw.acpi.osname on certain machines

Jung-uk Kim jkim at FreeBSD.org
Fri Oct 31 17:20:05 PDT 2008


The following reply was made to PR kern/121504; it has been noted by GNATS.

From: Jung-uk Kim <jkim at FreeBSD.org>
To: "Anish Mistry" <amistry at am-productions.biz>
Cc: bug-followup at FreeBSD.org,
 John Baldwin <jhb at FreeBSD.org>
Subject: Re: kern/121504: [patch] Correctly set hw.acpi.osname on certain machines
Date: Fri, 31 Oct 2008 20:09:50 -0400

 --Boundary-00=_Q55CJS/aKGjigvh
 Content-Type: text/plain;
   charset="iso-8859-1"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 If you are still feeling adventurous, please try the attached patch.  
 Note that _OSI is very different from _OS_ and we cannot reuse 
 "hw.acpi.osname" tunable here.  First of all, _OSI method must be 
 able to match multiple entries, not just predefined OS strings, e.g., 
 "3.0 Thermal Model", "Extended Address Space Descriptor", etc. 
 although nobody really uses these 'feature group strings' for their 
 BIOS implementations.  (Ideally, if there is a device driver which 
 implemented the feature, the driver is responsible for registering 
 its capabilities to this table.)
 
 With the attached patch, you can add multiple entries by setting 
 "hw.acpi.supported_osi" tunable and they must be comma-separated, 
 e.g.:
 
 hw.acpi.supported_osi="Windows 2006, Processor Device"
 
 You can even try something like this:
 
 hw.acpi.supported_osi="FreeBSD,Linux,Windows 2001,Windows 2006"
 
 It means the OS supports all of the above OS interfaces (but we 
 don't).  Well, it is not impossible, at least in theory. :-)
 
 Warning #1:
 It may affect your system badly if the BIOS implements OS-specific 
 "workarounds" or "features" for You-Know-Who. ;-)
 
 Warning #2:
 Even if your DSDT contains _OSI("FreeBSD"), it does not mean that you 
 can set hw.acpi.supported_osi="FreeBSD" and expect an improvement.  
 Most likely the code path is never tested and it may even cause 
 regression.  See http://ubuntuforums.org/showthread.php?t=869249 for 
 the latest Linux episode.  With the exact same reason, I am not 
 setting any default value here.
 
 Cheers,
 
 Jung-uk Kim
 
 --Boundary-00=_Q55CJS/aKGjigvh
 Content-Type: text/plain;
   charset="iso-8859-1";
   name="OsdMemory.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
 	filename="OsdMemory.patch"
 
 --- sys/dev/acpica/Osd/OsdMemory.c	22 Mar 2007 18:16:41 -0000	1.15
 +++ sys/dev/acpica/Osd/OsdMemory.c	31 Oct 2008 22:52:58 -0000
 @@ -40,6 +40,9 @@
  #include <vm/vm.h>
  #include <vm/pmap.h>
  
 +static char acpi_osi[128];
 +TUNABLE_STR("hw.acpi.supported_osi", acpi_osi, sizeof(acpi_osi));
 +
  MALLOC_DEFINE(M_ACPICA, "acpica", "ACPI CA memory pool");
  
  void *
 @@ -77,6 +80,29 @@
  ACPI_STATUS
  AcpiOsValidateInterface (char *Interface)
  {
 +    size_t	len;
 +    char	*cp;
 +
 +    if (Interface == NULL || *Interface == '\0')
 +	return (AE_BAD_PARAMETER);
 +
 +    if (*acpi_osi != '\0') {
 +	cp = acpi_osi;
 +	len = strlen(Interface);
 +	for (;;) {
 +	    if (strlen(cp) < len || (cp = strstr(cp, Interface)) == NULL)
 +		break;
 +	    cp += len;
 +	    if (*cp == '\0' || *cp == ',') {
 +		if (bootverbose)
 +		    printf("ACPI: _OSI(\"%s\") matched\n", Interface);
 +		return (AE_OK);
 +	    }
 +	    while (*cp != '\0' && *cp != ',')
 +		cp++;
 +	}
 +    }
 +
      return (AE_SUPPORT);
  }
  
 
 --Boundary-00=_Q55CJS/aKGjigvh--


More information about the freebsd-acpi mailing list