diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2012-05-24 13:28:58 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2012-05-27 06:31:11 -0400 |
commit | f07d42ac7f2a7d650125d0cd7a79631c4522edaf (patch) | |
tree | 6fb088bc61544d23e8c7eb0d800129c3664cf7f4 /drivers/firewire | |
parent | 188726ecb66f022e92ec110ca85c62a937184636 (diff) |
firewire: core: allocate the low memory region
Prevent userspace applications from allocating low memory address
ranges. Otherwise, if some application happens to allocate such
a range and intends for a remote node to access it, and if that node
also implements SBP-2 (which will become more likely with the upcoming
SBP-2 target support), these accesses would be routed by the physical
DMA unit to some wrong memory address.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire')
-rw-r--r-- | drivers/firewire/core-transaction.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-transaction.c index 1c4980c32f90..fc2ad654e1ad 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c | |||
@@ -525,9 +525,10 @@ const struct fw_address_region fw_high_memory_region = | |||
525 | { .start = 0x000100000000ULL, .end = 0xffffe0000000ULL, }; | 525 | { .start = 0x000100000000ULL, .end = 0xffffe0000000ULL, }; |
526 | EXPORT_SYMBOL(fw_high_memory_region); | 526 | EXPORT_SYMBOL(fw_high_memory_region); |
527 | 527 | ||
528 | #if 0 | 528 | static const struct fw_address_region low_memory_region = |
529 | const struct fw_address_region fw_low_memory_region = | ||
530 | { .start = 0x000000000000ULL, .end = 0x000100000000ULL, }; | 529 | { .start = 0x000000000000ULL, .end = 0x000100000000ULL, }; |
530 | |||
531 | #if 0 | ||
531 | const struct fw_address_region fw_private_region = | 532 | const struct fw_address_region fw_private_region = |
532 | { .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL, }; | 533 | { .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL, }; |
533 | const struct fw_address_region fw_csr_region = | 534 | const struct fw_address_region fw_csr_region = |
@@ -1189,6 +1190,23 @@ static struct fw_address_handler registers = { | |||
1189 | .address_callback = handle_registers, | 1190 | .address_callback = handle_registers, |
1190 | }; | 1191 | }; |
1191 | 1192 | ||
1193 | static void handle_low_memory(struct fw_card *card, struct fw_request *request, | ||
1194 | int tcode, int destination, int source, int generation, | ||
1195 | unsigned long long offset, void *payload, size_t length, | ||
1196 | void *callback_data) | ||
1197 | { | ||
1198 | /* | ||
1199 | * This catches requests not handled by the physical DMA unit, | ||
1200 | * i.e., wrong transaction types or unauthorized source nodes. | ||
1201 | */ | ||
1202 | fw_send_response(card, request, RCODE_TYPE_ERROR); | ||
1203 | } | ||
1204 | |||
1205 | static struct fw_address_handler low_memory = { | ||
1206 | .length = 0x000100000000ULL, | ||
1207 | .address_callback = handle_low_memory, | ||
1208 | }; | ||
1209 | |||
1192 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); | 1210 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); |
1193 | MODULE_DESCRIPTION("Core IEEE1394 transaction logic"); | 1211 | MODULE_DESCRIPTION("Core IEEE1394 transaction logic"); |
1194 | MODULE_LICENSE("GPL"); | 1212 | MODULE_LICENSE("GPL"); |
@@ -1250,6 +1268,7 @@ static int __init fw_core_init(void) | |||
1250 | 1268 | ||
1251 | fw_core_add_address_handler(&topology_map, &topology_map_region); | 1269 | fw_core_add_address_handler(&topology_map, &topology_map_region); |
1252 | fw_core_add_address_handler(®isters, ®isters_region); | 1270 | fw_core_add_address_handler(®isters, ®isters_region); |
1271 | fw_core_add_address_handler(&low_memory, &low_memory_region); | ||
1253 | fw_core_add_descriptor(&vendor_id_descriptor); | 1272 | fw_core_add_descriptor(&vendor_id_descriptor); |
1254 | fw_core_add_descriptor(&model_id_descriptor); | 1273 | fw_core_add_descriptor(&model_id_descriptor); |
1255 | 1274 | ||