RE: [PATCH] ACPICA / hwreg: Use acpi_gbl_reduced_hardware to prevent accessing PM registers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Moore, Robert
> Sent: Friday, September 13, 2013 6:08 AM
> To: Hanjun Guo; Rafael J. Wysocki; Len Brown
> Cc: Zheng, Lv; linux-acpi@xxxxxxxxxxxxxxx; patches@xxxxxxxxxx; linaro-
> kernel@xxxxxxxxxxxxxxxx; linaro-acpi@xxxxxxxxxxxxxxxx
> Subject: RE: [PATCH] ACPICA / hwreg: Use acpi_gbl_reduced_hardware to
> prevent accessing PM registers
> 
> NOT_IMPLEMENTED refers to the software only; therefore AE_SUPPORT should
> be returned.
> 
> Otherwise, seems like this may be a good idea.


On the other hand, could one not argue that the host OS should darn well know that it is executing on a hardware-reduced platform and not call these functions in the first place?

Bob




> 
> 
> > -----Original Message-----
> > From: Hanjun Guo [mailto:hanjun.guo@xxxxxxxxxx]
> > Sent: Friday, September 13, 2013 3:06 AM
> > To: Rafael J. Wysocki; Len Brown
> > Cc: Zheng, Lv; Moore, Robert; linux-acpi@xxxxxxxxxxxxxxx;
> > patches@xxxxxxxxxx; linaro-kernel@xxxxxxxxxxxxxxxx; linaro-
> > acpi@xxxxxxxxxxxxxxxx; Hanjun Guo
> > Subject: [PATCH] ACPICA / hwreg: Use acpi_gbl_reduced_hardware to
> > prevent accessing PM registers
> >
> > On hardware reduced platforms, there is no support for the following:
> >  - PM Event and Control registers
> >  - SCI interrupt (and handler)
> >  - Fixed Events
> >  - General Purpose Events (GPEs)
> >  - Global Lock
> >  - ACPI PM timer
> >  - FACS table (Waking vectors and Global Lock)
> >
> > acpi_gbl_reduced_hardware is a global flag and can be used to prevent
> > misbehavior on hardware reduced platforms, and this flag is
> > initialized at the very beginning of the system boot when FADT is
> > parsed, this flag is set to 1 when the FACP Hardware Reduced flag is
> > set, so we can use it to prevent accessing registers which do not
> > exist on reduced hardware platform.
> >
> > but when FACP Hardware Reduced flag is set, ACPI drivers will still
> > access some registers directly which do not exist on reduced hardware
> > platform and cause boot failure:
> >
> > [    9.024370] Unable to handle kernel paging request at virtual address
> > ffffffbffbe00001
> > [    9.024423] pgd = ffffffc00007d000
> > [    9.024468] [ffffffbffbe00001] *pgd=000000008007f003,
> > *pmd=0000000000000000
> > [    9.024538] Internal error: Oops: 96000006 [#1] SMP
> > [    9.024577] Modules linked in:
> > [    9.024627] CPU: 0    Not tainted  (3.9.0+ #3)
> > [    9.024691] PC is at acpi_os_read_port+0x58/0xc8
> > [    9.024753] LR is at acpi_hw_read_port+0x4c/0xc4
> > [    9.024810] pc : [<ffffffc0002810cc>] lr : [<ffffffc0002a4fc4>]
> pstate:
> > 600003c5
> > ....
> > [    9.031956] Call trace:
> > [    9.032021] [<ffffffc0002810cc>] acpi_os_read_port+0x58/0xc8
> > [    9.032094] [<ffffffc0002a4fc4>] acpi_hw_read_port+0x4c/0xc4
> > [    9.032165] [<ffffffc0002a4198>] acpi_hw_read+0x6c/0x100
> > [    9.032237] [<ffffffc0002a4250>] acpi_hw_read_multiple+0x24/0x70
> > [    9.032312] [<ffffffc0002a457c>] acpi_hw_register_read+0xa8/0x164
> > [    9.032386] [<ffffffc0002a52dc>] acpi_write_bit_register+0x9c/0x194
> > [    9.032472] [<ffffffc0002bffb4>]
> > acpi_processor_get_power_info+0x6c4/0x748
> > [    9.032550] [<ffffffc000565220>] acpi_processor_power_init+0xac/0x138
> > [    9.032630] [<ffffffc0003f3c00>] acpi_processor_start+0x48/0x138
> > [    9.032704] [<ffffffc000565118>] acpi_processor_add+0x43c/0x498
> > [    9.032784] [<ffffffc000283a74>] acpi_device_probe+0x3c/0x198
> > [    9.032862] [<ffffffc0002ef0fc>] driver_probe_device+0x90/0x348
> > [    9.032940] [<ffffffc0002ef450>] __driver_attach+0x9c/0xa0
> > [    9.033015] [<ffffffc0002ed40c>] bus_for_each_dev+0x4c/0x8c
> > [    9.033090] [<ffffffc0002eeb98>] driver_attach+0x20/0x28
> > [    9.033166] [<ffffffc0002ee6e0>] bus_add_driver+0xfc/0x254
> > [    9.033244] [<ffffffc0002ef8b0>] driver_register+0x6c/0x184
> > [    9.033325] [<ffffffc000284894>] acpi_bus_register_driver+0x34/0x44
> > [    9.033400] [<ffffffc000559c60>] acpi_processor_init+0x28/0x40
> > [    9.033469] [<ffffffc000081438>] do_one_initcall+0x100/0x138
> > [    9.033544] [<ffffffc0005448c8>] kernel_init_freeable+0x128/0x1cc
> > [    9.033620] [<ffffffc0003f2f90>] kernel_init+0x10/0xcc
> > [    9.033700] Code: d2bf7c02 f2dff7e2 f2ffffe2 8b020000 (79400000)
> > [    9.033843] ---[ end trace 64376967e6bc20a9 ]---
> > [    9.033995] Kernel panic - not syncing: Attempted to kill init!
> > exitcode=0x0000000b
> >
> > So acpi_gbl_reduced_hardware should be used to check if reduced
> > hardware or not, if it is reduced hardware, just return with some
> > error and do not access the no-existent registers.
> >
> > Signed-off-by: Hanjun Guo <hanjun.guo@xxxxxxxxxx>
> > ---
> >  drivers/acpi/acpica/hwregs.c |   24 ++++++++++++++++++++++++
> >  1 file changed, 24 insertions(+)
> >
> > diff --git a/drivers/acpi/acpica/hwregs.c
> > b/drivers/acpi/acpica/hwregs.c index 8d2e866..4c270c3 100644
> > --- a/drivers/acpi/acpica/hwregs.c
> > +++ b/drivers/acpi/acpica/hwregs.c
> > @@ -265,6 +265,11 @@ acpi_status acpi_hw_clear_acpi_status(void)
> >
> >  	ACPI_FUNCTION_TRACE(hw_clear_acpi_status);
> >
> > +	/* If Hardware Reduced flag is set, there are no GPEs */
> > +	if (acpi_gbl_reduced_hardware) {
> > +		return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
> > +	}
> > +
> >  	ACPI_DEBUG_PRINT((ACPI_DB_IO, "About to write %04X to %8.8X%8.8X\n",
> >  			  ACPI_BITMASK_ALL_FIXED_STATUS,
> >  			  ACPI_FORMAT_UINT64(acpi_gbl_xpm1a_status.address)));
> > @@ -305,6 +310,10 @@ struct acpi_bit_register_info
> > *acpi_hw_get_bit_register_info(u32 register_id)  {
> >  	ACPI_FUNCTION_ENTRY();
> >
> > +	if (acpi_gbl_reduced_hardware) {
> > +		return (NULL);
> > +	}
> > +
> >  	if (register_id > ACPI_BITREG_MAX) {
> >  		ACPI_ERROR((AE_INFO, "Invalid BitRegister ID: 0x%X",
> >  			    register_id));
> > @@ -337,6 +346,11 @@ acpi_status acpi_hw_write_pm1_control(u32
> > pm1a_control, u32 pm1b_control)
> >
> >  	ACPI_FUNCTION_TRACE(hw_write_pm1_control);
> >
> > +	/* If Hardware Reduced flag is set, there are no PM Control
> > registers */
> > +	if (acpi_gbl_reduced_hardware) {
> > +		return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
> > +	}
> > +
> >  	status =
> >  	    acpi_hw_write(pm1a_control, &acpi_gbl_FADT.xpm1a_control_block);
> >  	if (ACPI_FAILURE(status)) {
> > @@ -370,6 +384,11 @@ acpi_status acpi_hw_register_read(u32
> > register_id,
> > u32 *return_value)
> >
> >  	ACPI_FUNCTION_TRACE(hw_register_read);
> >
> > +	/* If Hardware Reduced flag is set, there are no PM Control
> > registers */
> > +	if (acpi_gbl_reduced_hardware) {
> > +		return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
> > +	}
> > +
> >  	switch (register_id) {
> >  	case ACPI_REGISTER_PM1_STATUS:	/* PM1 A/B: 16-bit access each
> > */
> >
> > @@ -465,6 +484,11 @@ acpi_status acpi_hw_register_write(u32
> > register_id,
> > u32 value)
> >
> >  	ACPI_FUNCTION_TRACE(hw_register_write);
> >
> > +	/* If Hardware Reduced flag is set, there are no PM Control
> > registers */
> > +	if (acpi_gbl_reduced_hardware) {
> > +		return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
> > +	}
> > +
> >  	switch (register_id) {
> >  	case ACPI_REGISTER_PM1_STATUS:	/* PM1 A/B: 16-bit access each
> > */
> >  		/*
> > --
> > 1.7.9.5

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




[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux