diff options
author | Christophe Fontaine <christophe.fontaine@qosmos.com> | 2016-04-09 12:38:49 +0900 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2016-04-18 13:20:57 +0000 |
commit | fef15b4bb88c61248393b93d13b1f79bb628def0 (patch) | |
tree | 0f34cc14987dde62a32201101c29b24b023fd36b /vnet | |
parent | 7a2a378d2dcdba900651b02859b686cafe6dfd22 (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.h | 4 | ||||
-rw-r--r-- | vnet/vnet/devices/dpdk/vhost_user.c | 4 | ||||
-rw-r--r-- | vnet/vnet/devices/ssvm/node.c | 8 | ||||
-rw-r--r-- | vnet/vnet/devices/ssvm/ssvm_eth.c | 10 | ||||
-rw-r--r-- | vnet/vnet/devices/ssvm/ssvm_eth.h | 2 | ||||
-rw-r--r-- | vnet/vnet/ip/lookup.h | 4 | ||||
-rw-r--r-- | vnet/vnet/l2/l2_flood.c | 4 |
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 |