4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #ifndef __STACKTRIM_H__
21 #define __STACKTRIM_H__
29 #define PAGE_SIZE (1 << 12)
30 #define _ALIGN_UP(addr, size) (((addr)+((size)-1))&(~((size)-1)))
31 #define _ALIGN_DOWN(addr, size) ((addr)&(~((size)-1)))
32 #define PAGE_ALIGN(addr) _ALIGN_DOWN(addr, PAGE_SIZE)
34 static inline void stack_trim(void)
40 unsigned int stacktop;
43 asm volatile ("mov %0,sp " : "=r"(sp));
45 sprintf(buf, "/proc/%d/maps", getpid());
46 file = fopen(buf, "r");
47 while (fgets(buf, BUF_SIZE, file) != NULL) {
48 if (strstr(buf, "[stack]")) {
56 sscanf(buf, "%x-", &stacktop);
57 if (madvise((void *)PAGE_ALIGN(stacktop), PAGE_ALIGN(sp) - stacktop,
59 perror("stack madvise fail");
64 #endif /* __STACKTRIM_H__ */