summaryrefslogtreecommitdiffstats
path: root/vnet
diff options
context:
space:
mode:
authorChristophe Fontaine <christophe.fontaine@qosmos.com>2016-04-09 12:38:49 +0900
committerDave Barach <openvpp@barachs.net>2016-04-18 13:20:57 +0000
commitfef15b4bb88c61248393b93d13b1f79bb628def0 (patch)
tree0f34cc14987dde62a32201101c29b24b023fd36b /vnet
parent7a2a378d2dcdba900651b02859b686cafe6dfd22 (diff)
Add support for AArch32
gcc version 4.9.2 (Raspbian 4.9.2-10) Tested on Linux raspberrypi 4.4.6-v7+ #875 SMP Tue Apr 12 16:33:02 BST 2016 armv7l GNU/Linux CPUs may be little or big endian, detect with gcc flags, not the processor architecture Add a new flag $(PLATFORM)_uses_openssl which allows to disable the link with openssl lib. vlib/vlib/threads.c: startup.conf must: - specify the heapsize as we don't have hugepages on raspbian cpu { main-core 3 } heapsize 64M Corrects in various files the assumption uword == u64 and replaces 'u64' cast with 'pointer_to_uword' and 'uword_to_pointer' where appropriate. 256 CPUs may create an OOM when testing with small memory footprint ( heapsize 64M ), allows the number of VLIB_MAX_CPUS to be set in platforms/*.mk vppinfra/vppinfra/longjmp.S: ARM - copy r1 (1st parameter of the setjmp call) to r0 (return value) vppinfra/vppinfra/time.h: On ARMv7 in AArch32 mode, we can access to a 64bit register to retreive the cycles count. gcc on rpi only declare ARM_ARCH 6. Override this info, and check if it is possible to use 'mrrc'. /!\ the time function will NOT work without allowing the user mode access to the PMU. You may download the source of the kmod here: https://github.com/christophefontaine/arm_rdtsc Change-Id: I8142606436d9671a184133b935398427f08a8bd2 Signed-off-by: Christophe Fontaine <christophe.fontaine@qosmos.com>
Diffstat (limited to 'vnet')
-rw-r--r--vnet/vnet/classify/vnet_classify.h4
-rw-r--r--vnet/vnet/devices/dpdk/vhost_user.c4
-rw-r--r--vnet/vnet/devices/ssvm/node.c8
-rw-r--r--vnet/vnet/devices/ssvm/ssvm_eth.c10
-rw-r--r--vnet/vnet/devices/ssvm/ssvm_eth.h2
-rw-r--r--vnet/vnet/ip/lookup.h4
-rw-r--r--vnet/vnet/l2/l2_flood.c4
7 files changed, 18 insertions, 18 deletions
diff --git a/vnet/vnet/classify/vnet_classify.h b/vnet/vnet/classify/vnet_classify.h
index b7056c565d7..b19704ebd0f 100644
--- a/vnet/vnet/classify/vnet_classify.h
+++ b/vnet/vnet/classify/vnet_classify.h
@@ -40,11 +40,11 @@ extern vlib_node_registration_t ip6_classify_node;
#define CLASSIFY_TRACE 0
-#ifndef __aarch64__
+#if !defined( __aarch64__) && !defined(__arm__)
#define CLASSIFY_USE_SSE //Allow usage of SSE operations
#endif
-#define U32X4_ALIGNED(p) PREDICT_TRUE((((u64)p) & 0xf) == 0)
+#define U32X4_ALIGNED(p) PREDICT_TRUE((((intptr_t)p) & 0xf) == 0)
struct _vnet_classify_main;
typedef struct _vnet_classify_main vnet_classify_main_t;
diff --git a/vnet/vnet/devices/dpdk/vhost_user.c b/vnet/vnet/devices/dpdk/vhost_user.c
index 9db4a0ac163..9cdf664cb80 100644
--- a/vnet/vnet/devices/dpdk/vhost_user.c
+++ b/vnet/vnet/devices/dpdk/vhost_user.c
@@ -495,9 +495,9 @@ dpdk_vhost_user_set_mem_table(u32 hw_if_index, vhost_user_memory_t * vum, int fd
mem->regions[i].userspace_address = vum->regions[i].userspace_addr;
mapped_size = mem->regions[i].memory_size + vum->regions[i].mmap_offset;
- mapped_address = (uint64_t)(uintptr_t)mmap(NULL, mapped_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[i], 0);
+ mapped_address = pointer_to_uword(mmap(NULL, mapped_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[i], 0));
- if ((void *)mapped_address == MAP_FAILED)
+ if (uword_to_pointer(mapped_address, void*) == MAP_FAILED)
{
clib_warning("mmap error");
return 0;
diff --git a/vnet/vnet/devices/ssvm/node.c b/vnet/vnet/devices/ssvm/node.c
index b26d73d12b8..3a5709d0323 100644
--- a/vnet/vnet/devices/ssvm/node.c
+++ b/vnet/vnet/devices/ssvm/node.c
@@ -97,8 +97,8 @@ ssvm_eth_device_input (ssvm_eth_main_t * em,
uword n_trace = vlib_get_trace_count (vm, node);
/* Either side down? buh-bye... */
- if ((u64)(sh->opaque [MASTER_ADMIN_STATE_INDEX]) == 0 ||
- (u64)(sh->opaque [SLAVE_ADMIN_STATE_INDEX]) == 0)
+ if (pointer_to_uword(sh->opaque [MASTER_ADMIN_STATE_INDEX]) == 0 ||
+ pointer_to_uword(sh->opaque [SLAVE_ADMIN_STATE_INDEX]) == 0)
return 0;
if (intfc->i_am_master)
@@ -271,14 +271,14 @@ ssvm_eth_device_input (ssvm_eth_main_t * em,
ASSERT(vec_len(intfc->rx_queue) > 0);
- n_available = (u32)(u64)(sh->opaque[CHUNK_POOL_NFREE]);
+ n_available = (u32)pointer_to_uword(sh->opaque[CHUNK_POOL_NFREE]);
elt_indices = (u32 *)(sh->opaque[CHUNK_POOL_FREELIST_INDEX]);
memcpy (&elt_indices[n_available], intfc->rx_queue,
vec_len (intfc->rx_queue) * sizeof (u32));
n_available += vec_len (intfc->rx_queue);
- sh->opaque[CHUNK_POOL_NFREE] = (void *) (u64) n_available;
+ sh->opaque[CHUNK_POOL_NFREE] = uword_to_pointer(n_available, void* );
ssvm_unlock (sh);
diff --git a/vnet/vnet/devices/ssvm/ssvm_eth.c b/vnet/vnet/devices/ssvm/ssvm_eth.c
index 7d937f07937..23ec0261325 100644
--- a/vnet/vnet/devices/ssvm/ssvm_eth.c
+++ b/vnet/vnet/devices/ssvm/ssvm_eth.c
@@ -95,7 +95,7 @@ int ssvm_eth_create (ssvm_eth_main_t * em, u8 * name, int is_master)
sh->opaque [CHUNK_POOL_INDEX] = (void *) elts;
sh->opaque [CHUNK_POOL_FREELIST_INDEX] = (void *) elt_indices;
- sh->opaque [CHUNK_POOL_NFREE] = (void *) em->nbuffers;
+ sh->opaque [CHUNK_POOL_NFREE] = (void *)(uword) em->nbuffers;
ssvm_pop_heap (oldheap);
@@ -276,8 +276,8 @@ ssvm_eth_interface_tx (vlib_main_t * vm,
n_present_in_cache = vec_len (em->chunk_cache);
/* admin / link up/down check */
- if ((u64)(sh->opaque [MASTER_ADMIN_STATE_INDEX]) == 0 ||
- (u64)(sh->opaque [SLAVE_ADMIN_STATE_INDEX]) == 0)
+ if (sh->opaque [MASTER_ADMIN_STATE_INDEX] == 0 ||
+ sh->opaque [SLAVE_ADMIN_STATE_INDEX] == 0)
{
interface_down = 1;
goto out;
@@ -287,7 +287,7 @@ ssvm_eth_interface_tx (vlib_main_t * vm,
elts = (ssvm_eth_queue_elt_t *) (sh->opaque [CHUNK_POOL_INDEX]);
elt_indices = (u32 *) (sh->opaque [CHUNK_POOL_FREELIST_INDEX]);
- n_available = (u32) (u64) (sh->opaque [CHUNK_POOL_NFREE]);
+ n_available = (u32) pointer_to_uword(sh->opaque [CHUNK_POOL_NFREE]);
if (n_present_in_cache < n_left*2)
{
@@ -305,7 +305,7 @@ ssvm_eth_interface_tx (vlib_main_t * vm,
n_present_in_cache += n_allocated;
n_available -= n_allocated;
- sh->opaque [CHUNK_POOL_NFREE] = (void *) (u64) n_available;
+ sh->opaque [CHUNK_POOL_NFREE] = uword_to_pointer(n_available, void*);
_vec_len (em->chunk_cache) = n_present_in_cache;
}
diff --git a/vnet/vnet/devices/ssvm/ssvm_eth.h b/vnet/vnet/devices/ssvm/ssvm_eth.h
index 8f1f88964c2..23af7ed5ae8 100644
--- a/vnet/vnet/devices/ssvm/ssvm_eth.h
+++ b/vnet/vnet/devices/ssvm/ssvm_eth.h
@@ -114,7 +114,7 @@ static inline void ssvm_eth_validate_freelists (int need_lock)
ssvm_lock (sh, my_pid, 15);
elt_indices = (u32 *) (sh->opaque [CHUNK_POOL_FREELIST_INDEX]);
- n_available = (u32) (u64) (sh->opaque [CHUNK_POOL_NFREE]);
+ n_available = (u32) (uword) (sh->opaque [CHUNK_POOL_NFREE]);
for (i = 0; i < n_available; i++)
ASSERT (elt_indices[i] < 2048);
diff --git a/vnet/vnet/ip/lookup.h b/vnet/vnet/ip/lookup.h
index 76d803d2699..23cb02d79f4 100644
--- a/vnet/vnet/ip/lookup.h
+++ b/vnet/vnet/ip/lookup.h
@@ -198,14 +198,14 @@ vnet_ip_adjacency_signature (ip_adjacency_t * adj)
uword signature = 0xfeedfaceULL;
/* Skip heap handle, sum everything up to but not including share_count */
- signature = hash_memory64
+ signature = hash_memory
(STRUCT_MARK_PTR(adj, signature_start),
STRUCT_OFFSET_OF(ip_adjacency_t, signature_end)
- STRUCT_OFFSET_OF(ip_adjacency_t, signature_start),
signature);
/* and the rewrite */
- signature = hash_memory64 (&adj->rewrite_header, VLIB_BUFFER_PRE_DATA_SIZE,
+ signature = hash_memory (&adj->rewrite_header, VLIB_BUFFER_PRE_DATA_SIZE,
signature);
return signature;
}
diff --git a/vnet/vnet/l2/l2_flood.c b/vnet/vnet/l2/l2_flood.c
index 0d25f583bbb..e0c4bb7afac 100644
--- a/vnet/vnet/l2/l2_flood.c
+++ b/vnet/vnet/l2/l2_flood.c
@@ -174,7 +174,7 @@ l2flood_process (vlib_main_t * vm,
(!in_shg || members[0].shg != in_shg)))) {
// If more than one member then initiate replication
ctx = replication_prep (vm, b0, l2flood_node.index, 1 /* l2_packet */);
- ctx->feature_replicas = (u64) members;
+ ctx->feature_replicas = (uword) members;
ctx->feature_counter = current_member;
}
@@ -194,7 +194,7 @@ l2flood_process (vlib_main_t * vm,
ctx = replication_get_ctx (b0);
replication_clear_recycled (b0);
- members = (l2_flood_member_t *) ctx->feature_replicas;
+ members = (l2_flood_member_t *)(intptr_t) ctx->feature_replicas;
current_member = (i32)ctx->feature_counter - 1;
// Need to update input index from saved packet context
an class="o">++) { elt = clib_mem_bulk_alloc (mb); vec_add1 (elts, elt); } for (i = 0; i < n_iter; i++) elts[i]->data = i; for (i = 0; i < n_iter; i++) if (elts[i]->data != i) MB_TEST (0, "data corrupted"); for (i = 0; i < n_iter; i++) clib_mem_bulk_free (mb, elts[i]); /* * realloc all */ for (i = 0; i < n_iter; i++) { elt = clib_mem_bulk_alloc (mb); vec_add1 (elts, elt); } for (i = n_iter - 1; i >= 0; i--) elts[i]->data = i; for (i = n_iter - 1; i >= 0; i--) if (elts[i]->data != i) MB_TEST (0, "data corrupted"); for (i = 0; i < n_iter; i++) clib_mem_bulk_free (mb, elts[i]); clib_mem_bulk_destroy (mb); vec_free (elts); return 0; } static clib_error_t * mem_bulk_test (vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd_arg) { int res = 0; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "basic")) { res = mem_bulk_test_basic (vm, input); } else if (unformat (input, "all")) { if ((res = mem_bulk_test_basic (vm, input))) goto done; } else break; } done: if (res) return clib_error_return (0, "llist unit test failed"); return 0; } VLIB_CLI_COMMAND (mem_bulk_test_command, static) = { .path = "test membulk", .short_help = "internal membulk unit tests", .function = mem_bulk_test, }; /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */