diff --git a/include/lib/aarch32/arch_helpers.h b/include/lib/aarch32/arch_helpers.h
index 6369a5d78e01986fc2ac72d346207f966be10aad..5d9c1c1516693b07ac6f50b5adee5b04dd9dd0d6 100644
--- a/include/lib/aarch32/arch_helpers.h
+++ b/include/lib/aarch32/arch_helpers.h
@@ -210,7 +210,12 @@ DEFINE_SYSOP_FUNC(sev)
 DEFINE_SYSOP_TYPE_FUNC(dsb, sy)
 DEFINE_SYSOP_TYPE_FUNC(dmb, sy)
 DEFINE_SYSOP_TYPE_FUNC(dmb, st)
+
+/* dmb ld is not valid for armv7/thumb machines */
+#if ARM_ARCH_MAJOR != 7
 DEFINE_SYSOP_TYPE_FUNC(dmb, ld)
+#endif
+
 DEFINE_SYSOP_TYPE_FUNC(dsb, ish)
 DEFINE_SYSOP_TYPE_FUNC(dsb, ishst)
 DEFINE_SYSOP_TYPE_FUNC(dmb, ish)
@@ -323,6 +328,11 @@ DEFINE_DCOP_PARAM_FUNC(cvac, DCCMVAC)
 #define dsb()			dsbsy()
 #define dmb()			dmbsy()
 
+/* dmb ld is not valid for armv7/thumb machines, so alias it to dmb */
+#if ARM_ARCH_MAJOR == 7
+#define	dmbld()			dmb()
+#endif
+
 #define IS_IN_SECURE() \
 	(GET_NS_BIT(read_scr()) == 0)
 
diff --git a/lib/locks/bakery/bakery_lock_coherent.c b/lib/locks/bakery/bakery_lock_coherent.c
index 788ba981846ef8d3ba025c1a6ee5d46015e45d49..03277c32f7903d0d86484d398cd699210afeb766 100644
--- a/lib/locks/bakery/bakery_lock_coherent.c
+++ b/lib/locks/bakery/bakery_lock_coherent.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -133,7 +133,12 @@ void bakery_lock_get(bakery_lock_t *bakery)
 				bakery_ticket_number(bakery->lock_data[they]));
 		}
 	}
-	/* Lock acquired */
+
+	/*
+	 * Lock acquired. Ensure that any reads from a shared resource in the
+	 * critical section read values after the lock is acquired.
+	 */
+	dmbld();
 }
 
 
@@ -146,9 +151,11 @@ void bakery_lock_release(bakery_lock_t *bakery)
 	assert(bakery_ticket_number(bakery->lock_data[me]));
 
 	/*
-	 * Release lock by resetting ticket. Then signal other
-	 * waiting contenders
+	 * Ensure that other observers see any stores in the critical section
+	 * before releasing the lock. Release the lock by resetting ticket.
+	 * Then signal other waiting contenders.
 	 */
+	dmbst();
 	bakery->lock_data[me] = 0;
 	dsb();
 	sev();
diff --git a/lib/locks/bakery/bakery_lock_normal.c b/lib/locks/bakery/bakery_lock_normal.c
index 630226ae2d514c334637492502bba9009d27ff26..b947da9c7912e758c5e14ed387421da5293c7e65 100644
--- a/lib/locks/bakery/bakery_lock_normal.c
+++ b/lib/locks/bakery/bakery_lock_normal.c
@@ -204,7 +204,12 @@ void bakery_lock_get(bakery_lock_t *lock)
 				== bakery_ticket_number(their_bakery_info->lock_data));
 		}
 	}
-	/* Lock acquired */
+
+	/*
+	 * Lock acquired. Ensure that any reads from a shared resource in the
+	 * critical section read values after the lock is acquired.
+	 */
+	dmbld();
 }
 
 void bakery_lock_release(bakery_lock_t *lock)
@@ -220,6 +225,12 @@ void bakery_lock_release(bakery_lock_t *lock)
 
 	assert(is_lock_acquired(my_bakery_info, is_cached));
 
+	/*
+	 * Ensure that other observers see any stores in the critical section
+	 * before releasing the lock. Release the lock by resetting ticket.
+	 * Then signal other waiting contenders.
+	 */
+	dmbst();
 	my_bakery_info->lock_data = 0;
 	write_cache_op(my_bakery_info, is_cached);
 	sev();