Index: generic/include/mm/as.h
===================================================================
--- generic/include/mm/as.h	(revision 649799a0fe9f7bc1df2587fdea23c0763d276be5)
+++ generic/include/mm/as.h	(revision c23502d0c116fcac041f6a339a7791811e9f2e9c)
@@ -49,7 +49,8 @@
 #define FLAG_AS_KERNEL	    (1 << 0)	/**< Kernel address space. */
 
-enum as_area_type {
-	AS_AREA_TEXT = 1, AS_AREA_DATA, AS_AREA_STACK 
-};
+/** Address space area flags. */
+#define AS_AREA_READ	1
+#define AS_AREA_WRITE	2
+#define AS_AREA_EXEC	4
 
 /** Address space area structure.
@@ -61,5 +62,5 @@
 	SPINLOCK_DECLARE(lock);
 	link_t link;
-	as_area_type_t type;
+	int flags;
 	size_t size;		/**< Size of this area in multiples of PAGE_SIZE. */
 	__address base;		/**< Base address of this area. */
@@ -104,5 +105,5 @@
 extern void as_init(void);
 extern as_t *as_create(int flags);
-extern as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base);
+extern as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base);
 extern __address as_remap(as_t *as, __address address, size_t size, int flags);
 extern void as_set_mapping(as_t *as, __address page, __address frame);
Index: generic/src/lib/elf.c
===================================================================
--- generic/src/lib/elf.c	(revision 649799a0fe9f7bc1df2587fdea23c0763d276be5)
+++ generic/src/lib/elf.c	(revision c23502d0c116fcac041f6a339a7791811e9f2e9c)
@@ -156,5 +156,5 @@
 {
 	as_area_t *a;
-	int i, type = 0;
+	int i, flags = 0;
 	size_t segment_size;
 	__u8 *segment;
@@ -172,11 +172,10 @@
 		return EE_MEMORY;
 	
-	if (entry->p_flags & PF_X) {
-		type = AS_AREA_TEXT;
-	} else if (entry->p_flags & PF_W) {
-		type = AS_AREA_DATA;
-	} else {
-		return EE_UNSUPPORTED;
-	}
+	if (entry->p_flags & PF_X)
+		flags |= AS_AREA_EXEC;
+	if (entry->p_flags & PF_W)
+		flags |= AS_AREA_WRITE;
+	if (entry->p_flags & PF_R)
+		flags |= AS_AREA_READ;
 
 	/*
@@ -195,5 +194,5 @@
 		segment = ((void *) elf) + entry->p_offset;
 
-	a = as_area_create(as, type, SIZE2FRAMES(entry->p_memsz), entry->p_vaddr);
+	a = as_area_create(as, flags, SIZE2FRAMES(entry->p_memsz), entry->p_vaddr);
 	if (!a)
 		return EE_IRRECOVERABLE;
Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision 649799a0fe9f7bc1df2587fdea23c0763d276be5)
+++ generic/src/mm/as.c	(revision c23502d0c116fcac041f6a339a7791811e9f2e9c)
@@ -120,5 +120,5 @@
  *
  * @param as Target address space.
- * @param type Type of area.
+ * @param flags Flags of the area.
  * @param size Size of area in multiples of PAGE_SIZE.
  * @param base Base address of area.
@@ -126,5 +126,5 @@
  * @return Address space area on success or NULL on failure.
  */
-as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base)
+as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base)
 {
 	ipl_t ipl;
@@ -146,5 +146,5 @@
 	
 	link_initialize(&a->link);			
-	a->type = type;
+	a->flags = flags;
 	a->size = size;
 	a->base = base;
@@ -327,15 +327,14 @@
 	int flags;
 
-	switch (a->type) {
-		case AS_AREA_TEXT:
-			flags = PAGE_EXEC | PAGE_READ | PAGE_USER | PAGE_PRESENT | PAGE_CACHEABLE;
-			break;
-		case AS_AREA_DATA:
-		case AS_AREA_STACK:
-			flags = PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_PRESENT | PAGE_CACHEABLE;
-			break;
-		default:
-			panic("unexpected as_area_type_t %d", a->type);
-	}
+	flags = PAGE_USER | PAGE_PRESENT | PAGE_CACHEABLE;
+	
+	if (a->flags & AS_AREA_READ)
+		flags |= PAGE_READ;
+		
+	if (a->flags & AS_AREA_WRITE)
+		flags |= PAGE_WRITE;
+	
+	if (a->flags & AS_AREA_EXEC)
+		flags |= PAGE_EXEC;
 	
 	return flags;
Index: generic/src/proc/task.c
===================================================================
--- generic/src/proc/task.c	(revision 649799a0fe9f7bc1df2587fdea23c0763d276be5)
+++ generic/src/proc/task.c	(revision c23502d0c116fcac041f6a339a7791811e9f2e9c)
@@ -123,5 +123,5 @@
 	 * Create the data as_area.
 	 */
-	a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS);
+	a = as_area_create(as, AS_AREA_READ | AS_AREA_WRITE, 1, USTACK_ADDRESS);
 	
 	thread_ready(t);
