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