summaryrefslogtreecommitdiff
path: root/src/kservice.c
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2018-10-26 06:35:42 +0800
committerBernard Xiong <[email protected]>2018-10-26 06:35:42 +0800
commit484afe9d2cb07c9e552ff905328eecb7170e8c8a (patch)
treec5a3e180665c7d49167da6dbefb08dcf88fff0f3 /src/kservice.c
parentd23a65d54ec519b0b1bb844d3b2758b2253d4ff7 (diff)
[Kernel] Add 64bit CPU support.
Diffstat (limited to 'src/kservice.c')
-rw-r--r--src/kservice.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/kservice.c b/src/kservice.c
index dbc4a2fb0e..95c9308182 100644
--- a/src/kservice.c
+++ b/src/kservice.c
@@ -1189,31 +1189,36 @@ RTM_EXPORT(rt_kprintf);
*/
void *rt_malloc_align(rt_size_t size, rt_size_t align)
{
- void *align_ptr;
void *ptr;
+ void *align_ptr;
+ int uintptr_size;
rt_size_t align_size;
- /* align the alignment size to 4 byte */
- align = ((align + 0x03) & ~0x03);
+ /* sizeof pointer */
+ uintptr_size = sizeof(void*);
+ uintptr_size -= 1;
+
+ /* align the alignment size to uintptr size byte */
+ align = ((align + uintptr_size) & ~uintptr_size);
/* get total aligned size */
- align_size = ((size + 0x03) & ~0x03) + align;
+ align_size = ((size + uintptr_size) & ~uintptr_size) + align;
/* allocate memory block from heap */
ptr = rt_malloc(align_size);
if (ptr != RT_NULL)
{
/* the allocated memory block is aligned */
- if (((rt_uint32_t)ptr & (align - 1)) == 0)
+ if (((rt_ubase_t)ptr & (align - 1)) == 0)
{
- align_ptr = (void *)((rt_uint32_t)ptr + align);
+ align_ptr = (void *)((rt_ubase_t)ptr + align);
}
else
{
- align_ptr = (void *)(((rt_uint32_t)ptr + (align - 1)) & ~(align - 1));
+ align_ptr = (void *)(((rt_ubase_t)ptr + (align - 1)) & ~(align - 1));
}
/* set the pointer before alignment pointer to the real pointer */
- *((rt_uint32_t *)((rt_uint32_t)align_ptr - sizeof(void *))) = (rt_uint32_t)ptr;
+ *((rt_ubase_t *)((rt_ubase_t)align_ptr - sizeof(void *))) = (rt_ubase_t)ptr;
ptr = align_ptr;
}
@@ -1232,7 +1237,7 @@ void rt_free_align(void *ptr)
{
void *real_ptr;
- real_ptr = (void *) * (rt_uint32_t *)((rt_uint32_t)ptr - sizeof(void *));
+ real_ptr = (void *) * (rt_ubase_t *)((rt_ubase_t)ptr - sizeof(void *));
rt_free(real_ptr);
}
RTM_EXPORT(rt_free_align);