1 /*
2  * Copyright (C) 2015-2018 Alibaba Group Holding Limited
3  */
4 
5 /* This file provides implementation of common (libc) functions that is defined
6  * in platform abstraction layer for AliOS Things.
7  */
8 
9 #if !defined(MBEDTLS_CONFIG_FILE)
10 #include "mbedtls/config.h"
11 #else
12 #include MBEDTLS_CONFIG_FILE
13 #endif
14 
15 #if defined(MBEDTLS_PLATFORM_C)
16 #include <stdlib.h>
17 #include <string.h>
18 #include <aos/kernel.h>
19 
20 #if defined(MBEDTLS_PLATFORM_MEMORY)
21 #if defined(XTENSA_MALLOC_IRAM)
22 extern void *iram_heap_malloc( size_t xWantedSize );
23 extern void  iram_heap_free( void *pv );
24 extern int   iram_heap_check_addr( void *addr );
25 
aos_mbedtls_calloc(size_t n,size_t size)26 void * aos_mbedtls_calloc( size_t n, size_t size )
27 {
28     void *buf = NULL;
29 
30     if( ( n == 0 ) || ( size == 0 ) )
31         return( NULL );
32 
33     buf = iram_heap_malloc( n * size );
34     if( buf == NULL )
35         buf = malloc( n * size );
36 
37     if( buf == NULL )
38         return( NULL );
39     else
40         memset( buf, 0, n * size );
41 
42     return( buf );
43 }
44 
aos_mbedtls_free(void * ptr)45 void aos_mbedtls_free( void *ptr )
46 {
47     if( ptr == NULL )
48         return;
49 
50     if( iram_heap_check_addr( ptr ) == 1 )
51         iram_heap_free( ptr );
52     else
53         free( ptr );
54 }
55 
56 #else /*XTENSA_MALLOC_IRAM*/
57 
aos_mbedtls_calloc(size_t n,size_t size)58 void * aos_mbedtls_calloc( size_t n, size_t size )
59 {
60     void *buf = NULL;
61 
62     buf = aos_malloc(n * size);
63     if( buf == NULL )
64         return( NULL );
65     else
66         memset(buf, 0, n * size);
67 
68     return( buf );
69 }
70 
aos_mbedtls_free(void * ptr)71 void aos_mbedtls_free( void *ptr )
72 {
73     if( ptr == NULL )
74         return;
75 
76     aos_free( ptr );
77 }
78 #endif /*XTENSA_MALLOC_IRAM*/
79 #endif /*MBEDTLS_PLATFORM_MEMORY*/
80 #endif /*MBEDTLS_PLATFORM_C*/
81