Subversion Repositories HelenOS-historic

Rev

Rev 1363 | Rev 1505 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1363 Rev 1501
Line 24... Line 24...
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
-
 
29
#include <stdlib.h>
-
 
30
#include <unistd.h>
-
 
31
#include <string.h>
-
 
32
#include <ddi.h>
-
 
33
#include <sysinfo.h>
-
 
34
#include <align.h>
-
 
35
#include <as.h>
-
 
36
#include <ipc/fb.h>
-
 
37
#include <ipc/ipc.h>
-
 
38
#include <ipc/ns.h>
-
 
39
#include <ipc/services.h>
-
 
40
#include <kernel/errno.h>
-
 
41
 
-
 
42
 
29
#include <as.h>
43
#include <as.h>
30
#include <libc.h>
44
#include <libc.h>
31
#include <unistd.h>
45
#include <unistd.h>
32
#include <task.h>
46
#include <align.h>
33
 
47
 
34
/** Create address space area.
48
/** Create address space area.
35
 *
49
 *
36
 * @param address Virtual address where to place new address space area.
50
 * @param address Virtual address where to place new address space area.
37
 * @param size Size of the area.
51
 * @param size Size of the area.
Line 68... Line 82...
68
    return __SYSCALL1(SYS_AS_AREA_DESTROY, (sysarg_t ) address);
82
    return __SYSCALL1(SYS_AS_AREA_DESTROY, (sysarg_t ) address);
69
}
83
}
70
 
84
 
71
static size_t heapsize = 0;
85
static size_t heapsize = 0;
72
static size_t maxheapsize = (size_t)(-1);
86
static size_t maxheapsize = (size_t)(-1);
-
 
87
 
-
 
88
static void * last_allocated = 0;
-
 
89
 
73
/* Start of heap linker symbol */
90
/* Start of heap linker symbol */
74
extern char _heap;
91
extern char _heap;
75
 
92
 
76
/** Sbrk emulation
93
/** Sbrk emulation
77
 *
94
 *
Line 105... Line 122...
105
    heapsize += incr;
122
    heapsize += incr;
106
 
123
 
107
    return res;
124
    return res;
108
}
125
}
109
 
126
 
-
 
127
/** Set maximum heap size and return pointer just after the heap */
110
void *set_maxheapsize(size_t mhs)
128
void *set_maxheapsize(size_t mhs)
111
{
129
{
112
    maxheapsize=mhs;
130
    maxheapsize=mhs;
113
    /* Return pointer to area not managed by sbrk */
131
    /* Return pointer to area not managed by sbrk */
114
    return (void *)&_heap + maxheapsize;
132
    return (void *)&_heap + maxheapsize;
115
 
133
 
116
}
134
}
-
 
135
 
-
 
136
/** Return pointer to some unmapped area, where fits new as_area
-
 
137
 *
-
 
138
 * TODO: make some first_fit/... algorithm, we are now just incrementing
-
 
139
 *       the pointer to last area
-
 
140
 */
-
 
141
void * as_get_mappable_page(size_t sz)
-
 
142
{
-
 
143
    void *res;
-
 
144
 
-
 
145
    /* Set heapsize to some meaningful value */
-
 
146
    if (maxheapsize == -1)
-
 
147
        set_maxheapsize(ALIGN_UP(USER_ADDRESS_SPACE_SIZE_ARCH>>1,PAGE_SIZE));
-
 
148
    if (!last_allocated)
-
 
149
        last_allocated = ALIGN_UP((void *)&_heap + maxheapsize, PAGE_SIZE);
-
 
150
   
-
 
151
    sz = ALIGN_UP(sz, PAGE_SIZE);
-
 
152
    res = last_allocated;
-
 
153
    last_allocated += sz;
-
 
154
 
-
 
155
    return res;
-
 
156
}