summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgkostka <kostka.grzegorz@gmail.com>2016-04-01 15:05:29 +0200
committergkostka <kostka.grzegorz@gmail.com>2016-04-01 15:20:40 +0200
commit0589b9280b623ef2dc2ec2c5c879b4d23cabddb9 (patch)
treea4f8a3b08e0e976cee5da9a849c4c2d950b5b8df
parent53b4f91981f5898473830d53c24c27e17f83a8a1 (diff)
ext4_config: add CONFIG_UNALIGNED_ACCESS configuration switch
On some targets unaligned 32/16 bit access will raise exeption.
-rw-r--r--CMakeLists.txt4
-rw-r--r--include/ext4_config.h5
-rw-r--r--src/ext4_bitmap.c5
3 files changed, 11 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1ffb96a..f104b65 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,11 +15,11 @@ add_definitions(-DVERSION="${VERSION}")
if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m0)
#...
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m3)
- #...
+ add_definitions(-DCONFIG_UNALIGNED_ACCESS=1)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL arm-sim)
#...
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m4)
- #...
+ add_definitions(-DCONFIG_UNALIGNED_ACCESS=1)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL bf518)
#...
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL avrxmega7)
diff --git a/include/ext4_config.h b/include/ext4_config.h
index 0fc06cd..82dff16 100644
--- a/include/ext4_config.h
+++ b/include/ext4_config.h
@@ -144,6 +144,11 @@ extern "C" {
#define CONFIG_MAX_TRUNCATE_SIZE (16ul * 1024ul * 1024ul)
#endif
+
+/**@brief Unaligned access switch on/off*/
+#ifndef CONFIG_UNALIGNED_ACCESS
+#define CONFIG_UNALIGNED_ACCESS 1
+#endif
#ifdef __cplusplus
}
#endif
diff --git a/src/ext4_bitmap.c b/src/ext4_bitmap.c
index 807acb9..be37a5a 100644
--- a/src/ext4_bitmap.c
+++ b/src/ext4_bitmap.c
@@ -59,6 +59,7 @@ void ext4_bmap_bits_free(uint8_t *bmap, uint32_t sbit, uint32_t bcnt)
sbit = i;
bmap += (sbit >> 3);
+#if CONFIG_UNALIGNED_ACCESS
while (bcnt >= 32) {
*(uint32_t *)bmap = 0;
bmap += 4;
@@ -72,6 +73,7 @@ void ext4_bmap_bits_free(uint8_t *bmap, uint32_t sbit, uint32_t bcnt)
bcnt -= 16;
sbit += 16;
}
+#endif
while (bcnt >= 8) {
*bmap = 0;
@@ -110,6 +112,7 @@ int ext4_bmap_bit_find_clr(uint8_t *bmap, uint32_t sbit, uint32_t ebit,
sbit = i;
bmap += (sbit >> 3);
+#if CONFIG_UNALIGNED_ACCESS
while (bcnt >= 32) {
if (*(uint32_t *)bmap != 0xFFFFFFFF)
goto finish_it;
@@ -127,8 +130,8 @@ int ext4_bmap_bit_find_clr(uint8_t *bmap, uint32_t sbit, uint32_t ebit,
bcnt -= 16;
sbit += 16;
}
-
finish_it:
+#endif
while (bcnt >= 8) {
if (*bmap != 0xFF) {
for (i = 0; i < 8; ++i) {