diff mbox

[RFC] : ACPI: Rename ACPI processor device bus ID

Message ID 1242892973.8523.53.camel@localhost.localdomain (mailing list archive)
State RFC, archived
Headers show

Commit Message

Zhao, Yakui May 21, 2009, 8:02 a.m. UTC
On some boxes several processors use the same processor bus id.
But they are located in different scope. For example:
	\_SB.SCK0.CPU0
	\_SB.SCK1.CPU0
This follows the ACPI spec.

	As they use the same bus id, it can't be registered when
registering proc I/F. It causes that the ACPI processor driver can't
be bound with the processor device.
	
Rename the processor device bus id. And the new bus id will be 
generated as the following format:
	CPU+ CPU ID
	
For example: If the cpu ID is 5, then the bus ID will be "CPU5".
	If the CPU ID is 10, then the bus ID will be "CPUA".


Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
---
 drivers/acpi/processor_core.c |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)



--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Henrique de Moraes Holschuh May 23, 2009, 3:18 a.m. UTC | #1
On Thu, 21 May 2009, yakui_zhao wrote:
> +	sprintf(acpi_device_bid(device), "CPU%X", pr->id);

Is this safe against overflows, i.e. is pr->id something *we* set?  Because
if it is in any way read from the ACPI firmware, you have to either use
snprintf, or use the format string to limit the %X to a safe lenght...
Zhao, Yakui May 23, 2009, 5:20 a.m. UTC | #2
On Sat, 2009-05-23 at 11:18 +0800, Henrique de Moraes Holschuh wrote:
> On Thu, 21 May 2009, yakui_zhao wrote:
> > +	sprintf(acpi_device_bid(device), "CPU%X", pr->id);
> 
> Is this safe against overflows, i.e. is pr->id something *we* set?  Because
> if it is in any way read from the ACPI firmware, you have to either use
> snprintf, or use the format string to limit the %X to a safe lenght...
Thanks for pointing out this issue.
Now the array size of acpi_bus_id is 5. And when the cpu number is above
256, the overflow will happen. But it is very luck that the following
three bytes are not used by other variable because of align. And this
still can work.
Of course I already sent a patch, in which the array size is changed
from 5 to 8.

At the same time if the cpu number is less than or equal to 256, the
length of format string is safe.

thanks.

Best regards.
	Yakui 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Henrique de Moraes Holschuh May 23, 2009, 9:01 p.m. UTC | #3
On Sat, 23 May 2009, yakui_zhao wrote:
> On Sat, 2009-05-23 at 11:18 +0800, Henrique de Moraes Holschuh wrote:
> > On Thu, 21 May 2009, yakui_zhao wrote:
> > > +	sprintf(acpi_device_bid(device), "CPU%X", pr->id);
> > 
> > Is this safe against overflows, i.e. is pr->id something *we* set?  Because
> > if it is in any way read from the ACPI firmware, you have to either use
> > snprintf, or use the format string to limit the %X to a safe lenght...
> Thanks for pointing out this issue.
> Now the array size of acpi_bus_id is 5. And when the cpu number is above
> 256, the overflow will happen. But it is very luck that the following
> three bytes are not used by other variable because of align. And this
> still can work.
> Of course I already sent a patch, in which the array size is changed
> from 5 to 8.
> 
> At the same time if the cpu number is less than or equal to 256, the
> length of format string is safe.

Yeah, but I was really asking if, even with space for 8 chars, isn't there a
risk of pr->id being, say, 0xfffffffe due to some wierdness...

If there is such a risk, you should use snprintf, or a a length limit in the
format...
Zhao, Yakui May 25, 2009, 12:59 a.m. UTC | #4
On Sun, 2009-05-24 at 05:01 +0800, Henrique de Moraes Holschuh wrote:
> On Sat, 23 May 2009, yakui_zhao wrote:
> > On Sat, 2009-05-23 at 11:18 +0800, Henrique de Moraes Holschuh wrote:
> > > On Thu, 21 May 2009, yakui_zhao wrote:
> > > > +	sprintf(acpi_device_bid(device), "CPU%X", pr->id);
> > > 
> > > Is this safe against overflows, i.e. is pr->id something *we* set?  Because
> > > if it is in any way read from the ACPI firmware, you have to either use
> > > snprintf, or use the format string to limit the %X to a safe lenght...
> > Thanks for pointing out this issue.
> > Now the array size of acpi_bus_id is 5. And when the cpu number is above
> > 256, the overflow will happen. But it is very luck that the following
> > three bytes are not used by other variable because of align. And this
> > still can work.
> > Of course I already sent a patch, in which the array size is changed
> > from 5 to 8.
> > 
> > At the same time if the cpu number is less than or equal to 256, the
> > length of format string is safe.
> 
> Yeah, but I was really asking if, even with space for 8 chars, isn't there a
> risk of pr->id being, say, 0xfffffffe due to some wierdness...

If the pr->id is set to 0xfffffffe, it is a risk.
But in fact OS will get the correct cpu id by using the function of
get_cpu_id. The result value is -1 or other correct cpu id.

So it is unnecessary to worry that the incorrect value is assigned to
pr->id.

Of course it will be OK to use the snprintf instead of sprintf.
thanks.
> If there is such a risk, you should use snprintf, or a a length limit in the
> format...

> 

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

Index: linux-2.6/drivers/acpi/processor_core.c
===================================================================
--- linux-2.6.orig/drivers/acpi/processor_core.c	2009-05-21 14:44:18.000000000 +0800
+++ linux-2.6/drivers/acpi/processor_core.c	2009-05-21 15:55:13.000000000 +0800
@@ -649,7 +649,16 @@ 
 			return -ENODEV;
 		}
 	}
-
+	/*
+	 * On some boxes several processors use the same processor bus id.
+	 * But they are located in different scope. For example:
+	 * \_SB.SCK0.CPU0
+	 * \_SB.SCK1.CPU0
+	 * Rename the processor device bus id. And the new bus id will be
+	 * generated as the following format:
+	 * CPU+CPU ID.
+	 */
+	sprintf(acpi_device_bid(device), "CPU%X", pr->id);
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id,
 			  pr->acpi_id));