ACPI, APEI: Cleanup alignment-aware accesses
authorChen, Gong <gong.chen@linux.intel.com>
Wed, 18 Dec 2013 06:30:49 +0000 (01:30 -0500)
committerBorislav Petkov <bp@suse.de>
Sat, 21 Dec 2013 12:31:37 +0000 (13:31 +0100)
We do use memcpy to avoid access alignment issues between firmware and
OS. Now we can use a better and standard way to avoid this issue. While
at it, simplify some variable names to avoid the 80 cols limit and
use structure assignment instead of unnecessary memcpy. No functional
changes.

Because ERST record id cache is implemented in memory to increase the
access speed via caching ERST content we can refrain from using memcpy
there too and use regular assignment instead.

Signed-off-by: Chen, Gong <gong.chen@linux.intel.com>
Cc: Cc: Tony Luck <tony.luck@intel.com>
Link: http://lkml.kernel.org/r/1387348249-20014-1-git-send-email-gong.chen@linux.intel.com
[ Boris: massage commit message a bit. ]
Signed-off-by: Borislav Petkov <bp@suse.de>
drivers/acpi/apei/apei-base.c
drivers/acpi/apei/einj.c
drivers/acpi/apei/erst.c

index 6d2c49b86b7fa82434bdb0b2ce1906c95dce00ca..e55584a072c632e35ad221f3cc4855e915baa0b0 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/rculist.h>
 #include <linux/interrupt.h>
 #include <linux/debugfs.h>
+#include <asm/unaligned.h>
 
 #include "apei-internal.h"
 
@@ -567,8 +568,7 @@ static int apei_check_gar(struct acpi_generic_address *reg, u64 *paddr,
        bit_offset = reg->bit_offset;
        access_size_code = reg->access_width;
        space_id = reg->space_id;
-       /* Handle possible alignment issues */
-       memcpy(paddr, &reg->address, sizeof(*paddr));
+       *paddr = get_unaligned(&reg->address);
        if (!*paddr) {
                pr_warning(FW_BUG APEI_PFX
                           "Invalid physical address in GAR [0x%llx/%u/%u/%u/%u]\n",
index fb57d03e698bd3b7ae2d4194d69dc3478ca09025..361177a9df3a2083b970d70358ad1fd0a7ee5811 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/delay.h>
 #include <linux/mm.h>
 #include <acpi/acpi.h>
+#include <asm/unaligned.h>
 
 #include "apei-internal.h"
 
@@ -216,7 +217,7 @@ static void check_vendor_extension(u64 paddr,
 static void *einj_get_parameter_address(void)
 {
        int i;
-       u64 paddrv4 = 0, paddrv5 = 0;
+       u64 pa_v4 = 0, pa_v5 = 0;
        struct acpi_whea_header *entry;
 
        entry = EINJ_TAB_ENTRY(einj_tab);
@@ -225,30 +226,28 @@ static void *einj_get_parameter_address(void)
                    entry->instruction == ACPI_EINJ_WRITE_REGISTER &&
                    entry->register_region.space_id ==
                    ACPI_ADR_SPACE_SYSTEM_MEMORY)
-                       memcpy(&paddrv4, &entry->register_region.address,
-                              sizeof(paddrv4));
+                       pa_v4 = get_unaligned(&entry->register_region.address);
                if (entry->action == ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS &&
                    entry->instruction == ACPI_EINJ_WRITE_REGISTER &&
                    entry->register_region.space_id ==
                    ACPI_ADR_SPACE_SYSTEM_MEMORY)
-                       memcpy(&paddrv5, &entry->register_region.address,
-                              sizeof(paddrv5));
+                       pa_v5 = get_unaligned(&entry->register_region.address);
                entry++;
        }
-       if (paddrv5) {
+       if (pa_v5) {
                struct set_error_type_with_address *v5param;
 
-               v5param = acpi_os_map_memory(paddrv5, sizeof(*v5param));
+               v5param = acpi_os_map_memory(pa_v5, sizeof(*v5param));
                if (v5param) {
                        acpi5 = 1;
-                       check_vendor_extension(paddrv5, v5param);
+                       check_vendor_extension(pa_v5, v5param);
                        return v5param;
                }
        }
-       if (param_extension && paddrv4) {
+       if (param_extension && pa_v4) {
                struct einj_parameter *v4param;
 
-               v4param = acpi_os_map_memory(paddrv4, sizeof(*v4param));
+               v4param = acpi_os_map_memory(pa_v4, sizeof(*v4param));
                if (!v4param)
                        return NULL;
                if (v4param->reserved1 || v4param->reserved2) {
index 26311f23c824f91354b3e47fe6fa5e5e448275dc..bf30a12f1988310324773343a28b3416b6462b1f 100644 (file)
@@ -611,7 +611,7 @@ static void __erst_record_id_cache_compact(void)
                if (entries[i] == APEI_ERST_INVALID_RECORD_ID)
                        continue;
                if (wpos != i)
-                       memcpy(&entries[wpos], &entries[i], sizeof(entries[i]));
+                       entries[wpos] = entries[i];
                wpos++;
        }
        erst_record_id_cache.len = wpos;