src/commonlib/lz4_wrapper: Correct inline asm for unaligned 64-bit copy
Rewrite inline assembly for ARMv7+ to correctly annotate inputs and outputs. On ARM GCC 6.1.1, this causes assembly output to change from the incorrect @ r0 is allocated to hold dst and x0 @ r1 is allocated to hold src and x1 ldr r0, [r1] @ clobbers dst! ldr r1, [r1, #4] str r0, [r0] str r1, [r0, #4] to the correct @ r0 is allocated to hold dst @ r1 is allocated to hold src and x1 @ r3 is allocated to hold x0 ldr r3, [r1] ldr r1, [r1, #4] str r3, [r0] str r1, [r0, #4] Also modify checkpatch.pl to ignore spaces before opening brackets when used in inline assembly. Change-Id: I255995f5e0a7b1a95375258755a93972c51d79b8 Signed-off-by: Benjamin Barenblat <bbaren@google.com> Reviewed-on: https://review.coreboot.org/15216 Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
This commit is contained in:
parent
c86da67436
commit
82ef8ada82
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
* Copyright 2015-2016 Google Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
|
@ -54,14 +54,18 @@ static void LZ4_copy8(void *dst, const void *src)
|
|||
((uint8_t *)dst)[i] = ((uint8_t *)src)[i];
|
||||
#else
|
||||
uint32_t x0, x1;
|
||||
__asm__ volatile (
|
||||
"ldr %[x0], [%[src]]\n\t"
|
||||
"ldr %[x1], [%[src], #4]\n\t"
|
||||
"str %[x0], [%[dst]]\n\t"
|
||||
"str %[x1], [%[dst], #4]\n\t"
|
||||
: [x0]"=r"(x0), [x1]"=r"(x1)
|
||||
: [src]"r"(src), [dst]"r"(dst)
|
||||
: "memory" );
|
||||
__asm__ ("ldr %[x0], [%[src]]"
|
||||
: [x0]"=r"(x0)
|
||||
: [src]"r"(src), "m"(*(const uint32_t *)src));
|
||||
__asm__ ("ldr %[x1], [%[src], #4]"
|
||||
: [x1]"=r"(x1)
|
||||
: [src]"r"(src), "m"(*(const uint32_t *)(src + 4)));
|
||||
__asm__ ("str %[x0], [%[dst]]"
|
||||
: "=m"(*(uint32_t *)dst)
|
||||
: [x0]"r"(x0), [dst]"r"(dst));
|
||||
__asm__ ("str %[x1], [%[dst], #4]"
|
||||
: "=m"(*(uint32_t *)(dst + 4))
|
||||
: [x1]"r"(x1), [dst]"r"(dst));
|
||||
#endif
|
||||
#elif defined(__riscv__)
|
||||
/* RISC-V implementations may trap on any unaligned access. */
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
|
||||
# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
|
||||
# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
|
||||
# (c) 2016 Google Inc.
|
||||
# Licensed under the terms of the GNU GPL License version 2
|
||||
|
||||
use strict;
|
||||
|
@ -3377,11 +3378,12 @@ sub process {
|
|||
# 1. with a type on the left -- int [] a;
|
||||
# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
|
||||
# 3. inside a curly brace -- = { [0...10] = 5 }
|
||||
# 4. in an extended asm instruction -- : [r0]"r"(r0)
|
||||
while ($line =~ /(.*?\s)\[/g) {
|
||||
my ($where, $prefix) = ($-[1], $1);
|
||||
if ($prefix !~ /$Type\s+$/ &&
|
||||
($where != 0 || $prefix !~ /^.\s+$/) &&
|
||||
$prefix !~ /[{,]\s+$/) {
|
||||
$prefix !~ /[{,:]\s+$/) {
|
||||
if (ERROR("BRACKET_SPACE",
|
||||
"space prohibited before open square bracket '['\n" . $herecurr) &&
|
||||
$fix) {
|
||||
|
|
Loading…
Reference in New Issue