]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg/BaseMemoryLibOptDxe ARM AARCH64: fix thinko in SetMem##
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Thu, 22 Sep 2016 08:52:00 +0000 (09:52 +0100)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Fri, 23 Sep 2016 10:50:51 +0000 (11:50 +0100)
The new InternalMemSetMem##() implementations for ARM and AARCH64 in
BaseMemoryLibOptDxe fail to take into account that the 'length' argument
is not in bytes, but in number of items to be copied. So multiply by the
item size before proceeding.

Reported-by: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
MdePkg/Library/BaseMemoryLibOptDxe/AArch64/SetMem.S
MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.S
MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.asm

index 7f361110d4fe086554c52e5c83390766546d5174..ec58f759d7b6d44df74b7e8dabccb690dbc2b6e6 100644 (file)
 ASM_GLOBAL ASM_PFX(InternalMemSetMem16)\r
 ASM_PFX(InternalMemSetMem16):\r
     dup     v0.8H, valw\r
+    lsl     count, count, #1\r
     b       0f\r
 \r
 ASM_GLOBAL ASM_PFX(InternalMemSetMem32)\r
 ASM_PFX(InternalMemSetMem32):\r
     dup     v0.4S, valw\r
+    lsl     count, count, #2\r
     b       0f\r
 \r
 ASM_GLOBAL ASM_PFX(InternalMemSetMem64)\r
 ASM_PFX(InternalMemSetMem64):\r
     dup     v0.2D, val\r
+    lsl     count, count, #3\r
     b       0f\r
 \r
 ASM_GLOBAL ASM_PFX(InternalMemZeroMem)\r
index c1755539d36abb94482679457591532ee0ccc1a0..add04443b2e9946dc48875693e8cd4180f74e391 100644 (file)
     .thumb\r
     .syntax unified\r
     .align  5\r
-ASM_GLOBAL ASM_PFX(InternalMemZeroMem)\r
-ASM_PFX(InternalMemZeroMem):\r
-    movs    r2, #0\r
-\r
-ASM_GLOBAL ASM_PFX(InternalMemSetMem)\r
-ASM_PFX(InternalMemSetMem):\r
-    uxtb    r2, r2\r
-    orr     r2, r2, r2, lsl #8\r
-\r
 ASM_GLOBAL ASM_PFX(InternalMemSetMem16)\r
 ASM_PFX(InternalMemSetMem16):\r
     uxth    r2, r2\r
+    lsl     r1, r1, #1\r
     orr     r2, r2, r2, lsl #16\r
+    b       0f\r
 \r
 ASM_GLOBAL ASM_PFX(InternalMemSetMem32)\r
 ASM_PFX(InternalMemSetMem32):\r
-    mov     r3, r2\r
+    lsl     r1, r1, #2\r
+    b       0f\r
 \r
 ASM_GLOBAL ASM_PFX(InternalMemSetMem64)\r
 ASM_PFX(InternalMemSetMem64):\r
-    push    {r4, lr}\r
+    lsl     r1, r1, #3\r
+    b       1f\r
+\r
+    .align  5\r
+ASM_GLOBAL ASM_PFX(InternalMemSetMem)\r
+ASM_PFX(InternalMemSetMem):\r
+    uxtb    r2, r2\r
+    orr     r2, r2, r2, lsl #8\r
+    orr     r2, r2, r2, lsl #16\r
+    b       0f\r
+\r
+ASM_GLOBAL ASM_PFX(InternalMemZeroMem)\r
+ASM_PFX(InternalMemZeroMem):\r
+    movs    r2, #0\r
+0:  mov     r3, r2\r
+\r
+1:  push    {r4, lr}\r
     cmp     r1, #16                 // fewer than 16 bytes of input?\r
     add     r1, r1, r0              // r1 := dst + length\r
     add     lr, r0, #16\r
index 2a8dc7d019f4e39d7bb55c2ed68c503ae66853c1..c2e2842a63230da0de0b5ffcaa58a63fa3721a8f 100644 (file)
     AREA    SetMem, CODE, READONLY, CODEALIGN, ALIGN=5\r
     THUMB\r
 \r
-InternalMemZeroMem\r
-    movs    r2, #0\r
+InternalMemSetMem16\r
+    uxth    r2, r2\r
+    lsl     r1, r1, #1\r
+    orr     r2, r2, r2, lsl #16\r
+    b       B0\r
+\r
+InternalMemSetMem32\r
+    lsl     r1, r1, #2\r
+    b       B0\r
+\r
+InternalMemSetMem64\r
+    lsl     r1, r1, #3\r
+    b       B1\r
 \r
+    ALIGN   32\r
 InternalMemSetMem\r
     uxtb    r2, r2\r
     orr     r2, r2, r2, lsl #8\r
+    orr     r2, r2, r2, lsl #16\r
+    b       B0\r
 \r
-InternalMemSetMem16\r
-    uxth    r2, r2\r
-    orr     r2, r2, r2, lsr #16\r
-\r
-InternalMemSetMem32\r
+InternalMemZeroMem\r
+    movs    r2, #0\r
+B0\r
     mov     r3, r2\r
 \r
-InternalMemSetMem64\r
+B1\r
     push    {r4, lr}\r
     cmp     r1, #16                 ; fewer than 16 bytes of input?\r
     add     r1, r1, r0              ; r1 := dst + length\r