|
@@ -24,9 +24,10 @@
|
|
|
#include <syscalls.h>
|
|
|
#include <heap.h>
|
|
|
#include <cpu.h>
|
|
|
+#include <semaphore.h>
|
|
|
|
|
|
static void **physical_memory_stack = (void**)MEM_STACK_VIRT_ADDR;
|
|
|
-static lock_t phys_mem_stack_lock = 0;
|
|
|
+static DECLARE_LOCK(phys_mem_stack_lock);
|
|
|
static page_t *pages = NULL;
|
|
|
static void *current_page_directory = INVALID_PAGE;
|
|
|
static memory_address_space_t kernel_address_space;
|
|
@@ -35,12 +36,12 @@ static list_entry_t user_address_spaces = { &user_address_spaces, &user_address_
|
|
|
static dword_t total_physical_pages = 0;
|
|
|
static dword_t num_free_pages = 0;
|
|
|
static dword_t mem_tree_bitmap[TOTAL_PAGES / 32];
|
|
|
-static lock_t mem_tree_lock = 0;
|
|
|
+static DECLARE_LOCK(mem_tree_lock);
|
|
|
static semaphore_t temporary_page_semaphore;
|
|
|
static bool_t evicting = FALSE;
|
|
|
static DECLARE_LIST(transition_pages);
|
|
|
static DECLARE_LIST(page_stores);
|
|
|
-static lock_t page_store_lock = 0;
|
|
|
+static DECLARE_LOCK(page_store_lock);
|
|
|
|
|
|
static void *evict_page(void);
|
|
|
|
|
@@ -62,18 +63,18 @@ static inline void *alloc_physical_page(void)
|
|
|
if (page != INVALID_PAGE) return page;
|
|
|
}
|
|
|
|
|
|
- acquire_lock(&phys_mem_stack_lock);
|
|
|
+ lock_acquire(&phys_mem_stack_lock);
|
|
|
if (num_free_pages) page = physical_memory_stack[--num_free_pages];
|
|
|
- release_lock(&phys_mem_stack_lock);
|
|
|
+ lock_release(&phys_mem_stack_lock);
|
|
|
|
|
|
return page;
|
|
|
}
|
|
|
|
|
|
static inline void free_physical_page(void *address)
|
|
|
{
|
|
|
- acquire_lock(&phys_mem_stack_lock);
|
|
|
+ lock_acquire(&phys_mem_stack_lock);
|
|
|
physical_memory_stack[num_free_pages++] = address;
|
|
|
- release_lock(&phys_mem_stack_lock);
|
|
|
+ lock_release(&phys_mem_stack_lock);
|
|
|
}
|
|
|
|
|
|
static int compare_page(const void *a, const void *b)
|
|
@@ -475,7 +476,7 @@ static memory_block_t *mem_tree_alloc(void)
|
|
|
dword_t i;
|
|
|
memory_block_t *block = NULL;
|
|
|
|
|
|
- acquire_lock(&mem_tree_lock);
|
|
|
+ lock_acquire(&mem_tree_lock);
|
|
|
for (i = 0; i < TOTAL_PAGES; i++) if (!test_bit(mem_tree_bitmap, i)) break;
|
|
|
|
|
|
if (i < TOTAL_PAGES)
|
|
@@ -493,7 +494,7 @@ static memory_block_t *mem_tree_alloc(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- release_lock(&mem_tree_lock);
|
|
|
+ lock_release(&mem_tree_lock);
|
|
|
return block;
|
|
|
}
|
|
|
|
|
@@ -503,7 +504,7 @@ static void mem_tree_free(memory_block_t *block)
|
|
|
bool_t busy = FALSE;
|
|
|
dword_t i, page = PAGE_ALIGN((dword_t)block);
|
|
|
|
|
|
- acquire_lock(&mem_tree_lock);
|
|
|
+ lock_acquire(&mem_tree_lock);
|
|
|
clear_bit(mem_tree_bitmap, index);
|
|
|
|
|
|
for (i = page; i < page + PAGE_SIZE; i += sizeof(memory_block_t))
|
|
@@ -517,7 +518,7 @@ static void mem_tree_free(memory_block_t *block)
|
|
|
}
|
|
|
|
|
|
if (!busy) free_page((void*)page);
|
|
|
- release_lock(&mem_tree_lock);
|
|
|
+ lock_release(&mem_tree_lock);
|
|
|
}
|
|
|
|
|
|
static memory_block_t *find_block_by_addr_internal(memory_block_t *block, void *address)
|
|
@@ -621,7 +622,7 @@ static inline void release_memory_block(memory_block_t *block)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- acquire_lock(&page_store_lock);
|
|
|
+ lock_acquire(&page_store_lock);
|
|
|
|
|
|
for (i = page_stores.next; i != &page_stores; i = i->next)
|
|
|
{
|
|
@@ -643,7 +644,7 @@ static inline void release_memory_block(memory_block_t *block)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- release_lock(&page_store_lock);
|
|
|
+ lock_release(&page_store_lock);
|
|
|
}
|
|
|
|
|
|
static void free_blocks_recursive(memory_block_t *block)
|
|
@@ -890,12 +891,12 @@ dword_t map_memory_in_address_space(memory_address_space_t *address_space,
|
|
|
if (*virtual != NULL && PAGE_OFFSET((uintptr_t)*virtual) != PAGE_OFFSET((uintptr_t)physical)) return ERR_INVALID;
|
|
|
|
|
|
size = (PAGE_ALIGN_UP((uintptr_t)physical + size - 1) - aligned_physical) >> 12;
|
|
|
- acquire_resource_exclusive(&address_space->resource);
|
|
|
+ lock_acquire(&address_space->lock);
|
|
|
|
|
|
memory_block_t *block = find_free_block(address_space, address, size);
|
|
|
if (block == NULL)
|
|
|
{
|
|
|
- release_resource(&address_space->resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
return ERR_NOMEMORY;
|
|
|
}
|
|
|
|
|
@@ -910,7 +911,7 @@ dword_t map_memory_in_address_space(memory_address_space_t *address_space,
|
|
|
ret = map_memory_internal((void*)aligned_physical, (void*)real_address, size * PAGE_SIZE, flags);
|
|
|
if (ret != ERR_SUCCESS)
|
|
|
{
|
|
|
- release_resource(&address_space->resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -953,7 +954,7 @@ dword_t map_memory_in_address_space(memory_address_space_t *address_space,
|
|
|
block->flags = block_flags;
|
|
|
*virtual = (void*)((dword_t)block->address + PAGE_OFFSET((uintptr_t)physical));
|
|
|
|
|
|
- release_resource(&address_space->resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
return ERR_SUCCESS;
|
|
|
}
|
|
|
|
|
@@ -965,14 +966,14 @@ dword_t pin_memory(const void *virtual, void **pinned, uintptr_t size, bool_t lo
|
|
|
size = PAGE_ALIGN_UP(size) >> 12;
|
|
|
|
|
|
memory_address_space_t *address_space = check_usermode(virtual, 1) ? &get_current_process()->memory_space : &kernel_address_space;
|
|
|
- acquire_resource_shared(&address_space->resource);
|
|
|
- acquire_resource_exclusive(&mapping_space.resource);
|
|
|
+ lock_acquire_shared(&address_space->lock);
|
|
|
+ lock_acquire(&mapping_space.lock);
|
|
|
|
|
|
memory_block_t *block = find_free_block(&mapping_space, address, size);
|
|
|
if (block == NULL)
|
|
|
{
|
|
|
- release_resource(&address_space->resource);
|
|
|
- release_resource(&mapping_space.resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
+ lock_release(&mapping_space.lock);
|
|
|
return ERR_NOMEMORY;
|
|
|
}
|
|
|
|
|
@@ -1038,27 +1039,27 @@ dword_t pin_memory(const void *virtual, void **pinned, uintptr_t size, bool_t lo
|
|
|
if (!lock_contents) block->flags |= MEMORY_BLOCK_WRITABLE;
|
|
|
*pinned = (void*)((dword_t)block->address) + PAGE_OFFSET((uintptr_t)virtual);
|
|
|
|
|
|
- release_resource(&address_space->resource);
|
|
|
- release_resource(&mapping_space.resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
+ lock_release(&mapping_space.lock);
|
|
|
return ERR_SUCCESS;
|
|
|
}
|
|
|
|
|
|
dword_t unmap_memory_in_address_space(memory_address_space_t *address_space, void *virtual)
|
|
|
{
|
|
|
- acquire_resource_exclusive(&mapping_space.resource);
|
|
|
+ lock_acquire(&mapping_space.lock);
|
|
|
uintptr_t aligned_address = PAGE_ALIGN((uintptr_t)virtual);
|
|
|
|
|
|
avl_node_t *node = avl_tree_lookup(&mapping_space.by_addr_tree, &aligned_address);
|
|
|
if (node == NULL)
|
|
|
{
|
|
|
- release_resource(&mapping_space.resource);
|
|
|
+ lock_release(&mapping_space.lock);
|
|
|
return ERR_INVALID;
|
|
|
}
|
|
|
|
|
|
memory_block_t *mem_block = CONTAINER_OF(node, memory_block_t, by_addr_node);
|
|
|
if (mem_block->flags & MEMORY_BLOCK_FREE)
|
|
|
{
|
|
|
- release_resource(&mapping_space.resource);
|
|
|
+ lock_release(&mapping_space.lock);
|
|
|
return ERR_INVALID;
|
|
|
}
|
|
|
|
|
@@ -1068,7 +1069,7 @@ dword_t unmap_memory_in_address_space(memory_address_space_t *address_space, voi
|
|
|
mem_block = combine_blocks_backward(mem_block);
|
|
|
mem_block = combine_blocks_forward(mem_block);
|
|
|
|
|
|
- release_resource(&mapping_space.resource);
|
|
|
+ lock_release(&mapping_space.lock);
|
|
|
return ERR_SUCCESS;
|
|
|
}
|
|
|
|
|
@@ -1095,12 +1096,12 @@ dword_t alloc_memory_in_address_space(memory_address_space_t *address_space,
|
|
|
size = PAGE_ALIGN_UP(size) >> 12;
|
|
|
if (size == 0) return ERR_INVALID;
|
|
|
|
|
|
- acquire_resource_exclusive(&address_space->resource);
|
|
|
+ lock_acquire(&address_space->lock);
|
|
|
|
|
|
memory_block_t *block = find_free_block(address_space, base_address, size);
|
|
|
if (block == NULL)
|
|
|
{
|
|
|
- release_resource(&address_space->resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
return ERR_NOMEMORY;
|
|
|
}
|
|
|
|
|
@@ -1156,26 +1157,26 @@ dword_t alloc_memory_in_address_space(memory_address_space_t *address_space,
|
|
|
*address = (void*)((dword_t)block->address);
|
|
|
if (block_flags & MEMORY_BLOCK_EVICTABLE) list_append(&address_space->evictable_blocks, &block->evict_link);
|
|
|
|
|
|
- release_resource(&address_space->resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
return ERR_SUCCESS;
|
|
|
}
|
|
|
|
|
|
dword_t free_memory_in_address_space(memory_address_space_t *address_space, void *address)
|
|
|
{
|
|
|
- acquire_resource_exclusive(&address_space->resource);
|
|
|
+ lock_acquire(&address_space->lock);
|
|
|
uintptr_t aligned_address = PAGE_ALIGN((uintptr_t)address);
|
|
|
|
|
|
avl_node_t *node = avl_tree_lookup(&address_space->by_addr_tree, &aligned_address);
|
|
|
if (node == NULL)
|
|
|
{
|
|
|
- release_resource(&address_space->resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
return ERR_INVALID;
|
|
|
}
|
|
|
|
|
|
memory_block_t *mem_block = CONTAINER_OF(node, memory_block_t, by_addr_node);
|
|
|
if (mem_block->flags & MEMORY_BLOCK_FREE)
|
|
|
{
|
|
|
- release_resource(&address_space->resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
return ERR_INVALID;
|
|
|
}
|
|
|
|
|
@@ -1187,7 +1188,7 @@ dword_t free_memory_in_address_space(memory_address_space_t *address_space, void
|
|
|
mem_block = combine_blocks_backward(mem_block);
|
|
|
mem_block = combine_blocks_forward(mem_block);
|
|
|
|
|
|
- release_resource(&address_space->resource);
|
|
|
+ lock_release(&address_space->lock);
|
|
|
return ERR_SUCCESS;
|
|
|
}
|
|
|
|
|
@@ -1385,13 +1386,13 @@ sysret_t syscall_commit_memory(handle_t process, void *address, dword_t size)
|
|
|
}
|
|
|
|
|
|
if (proc->terminating) return ERR_CANCELED;
|
|
|
- acquire_resource_shared(&proc->memory_space.resource);
|
|
|
+ lock_acquire_shared(&proc->memory_space.lock);
|
|
|
|
|
|
process_t *prev_proc = switch_process(proc);
|
|
|
ret = commit_pages(address, size);
|
|
|
switch_process(prev_proc);
|
|
|
|
|
|
- release_resource(&proc->memory_space.resource);
|
|
|
+ lock_release(&proc->memory_space.lock);
|
|
|
dereference(&proc->header);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1414,13 +1415,13 @@ sysret_t syscall_uncommit_memory(handle_t process, void *address, dword_t size)
|
|
|
}
|
|
|
|
|
|
if (proc->terminating) return ERR_CANCELED;
|
|
|
- acquire_resource_shared(&proc->memory_space.resource);
|
|
|
+ lock_acquire_shared(&proc->memory_space.lock);
|
|
|
|
|
|
process_t *prev_proc = switch_process(proc);
|
|
|
ret = uncommit_pages(address, size);
|
|
|
switch_process(prev_proc);
|
|
|
|
|
|
- release_resource(&proc->memory_space.resource);
|
|
|
+ lock_release(&proc->memory_space.lock);
|
|
|
dereference(&proc->header);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1444,7 +1445,7 @@ sysret_t syscall_set_memory_flags(handle_t process, void *address, dword_t flags
|
|
|
}
|
|
|
|
|
|
process_t *prev_proc = switch_process(proc);
|
|
|
- acquire_resource_exclusive(&proc->memory_space.resource);
|
|
|
+ lock_acquire(&proc->memory_space.lock);
|
|
|
|
|
|
memory_block_t *block = find_block_by_addr(&proc->memory_space, address);
|
|
|
if (block == NULL)
|
|
@@ -1497,7 +1498,7 @@ sysret_t syscall_set_memory_flags(handle_t process, void *address, dword_t flags
|
|
|
block->flags |= flags;
|
|
|
|
|
|
cleanup:
|
|
|
- release_resource(&proc->memory_space.resource);
|
|
|
+ lock_release(&proc->memory_space.lock);
|
|
|
switch_process(prev_proc);
|
|
|
dereference(&proc->header);
|
|
|
return ret;
|
|
@@ -1523,7 +1524,7 @@ sysret_t syscall_query_memory(handle_t process, void *address, memory_block_info
|
|
|
reference(&proc->header);
|
|
|
}
|
|
|
|
|
|
- acquire_resource_shared(&proc->memory_space.resource);
|
|
|
+ lock_acquire_shared(&proc->memory_space.lock);
|
|
|
|
|
|
memory_block_t *block = find_block_by_addr(&proc->memory_space, address);
|
|
|
if (block == NULL)
|
|
@@ -1545,7 +1546,7 @@ sysret_t syscall_query_memory(handle_t process, void *address, memory_block_info
|
|
|
EH_DONE;
|
|
|
|
|
|
cleanup:
|
|
|
- release_resource(&proc->memory_space.resource);
|
|
|
+ lock_release(&proc->memory_space.lock);
|
|
|
dereference(&proc->header);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1575,7 +1576,7 @@ sysret_t syscall_read_memory(handle_t process, void *address, void *buffer, dwor
|
|
|
if (!reference_by_handle(process, OBJECT_PROCESS, (object_t**)&proc)) return ERR_INVALID;
|
|
|
if (proc->terminating) return ERR_CANCELED;
|
|
|
|
|
|
- acquire_resource_shared(&proc->memory_space.resource);
|
|
|
+ lock_acquire_shared(&proc->memory_space.lock);
|
|
|
|
|
|
dword_t page;
|
|
|
dword_t first_page = PAGE_ALIGN((dword_t)address);
|
|
@@ -1604,7 +1605,7 @@ sysret_t syscall_read_memory(handle_t process, void *address, void *buffer, dwor
|
|
|
if (ret != ERR_SUCCESS) break;
|
|
|
}
|
|
|
|
|
|
- release_resource(&proc->memory_space.resource);
|
|
|
+ lock_release(&proc->memory_space.lock);
|
|
|
dereference(&proc->header);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1634,7 +1635,7 @@ sysret_t syscall_write_memory(handle_t process, void *address, void *buffer, dwo
|
|
|
if (!reference_by_handle(process, OBJECT_PROCESS, (object_t**)&proc)) return ERR_INVALID;
|
|
|
if (proc->terminating) return ERR_CANCELED;
|
|
|
|
|
|
- acquire_resource_exclusive(&proc->memory_space.resource);
|
|
|
+ lock_acquire(&proc->memory_space.lock);
|
|
|
|
|
|
dword_t page;
|
|
|
dword_t first_page = PAGE_ALIGN((dword_t)address);
|
|
@@ -1663,7 +1664,7 @@ sysret_t syscall_write_memory(handle_t process, void *address, void *buffer, dwo
|
|
|
if (ret != ERR_SUCCESS) break;
|
|
|
}
|
|
|
|
|
|
- release_resource(&proc->memory_space.resource);
|
|
|
+ lock_release(&proc->memory_space.lock);
|
|
|
dereference(&proc->header);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1899,7 +1900,7 @@ sysret_t syscall_flush_memory_section(handle_t process, void *address)
|
|
|
reference(&proc->header);
|
|
|
}
|
|
|
|
|
|
- acquire_resource_shared(&proc->memory_space.resource);
|
|
|
+ lock_acquire_shared(&proc->memory_space.lock);
|
|
|
|
|
|
memory_block_t *block = find_block_by_addr(&proc->memory_space, address);
|
|
|
if (block == NULL || block->section == NULL)
|
|
@@ -1922,14 +1923,14 @@ sysret_t syscall_flush_memory_section(handle_t process, void *address)
|
|
|
if (ret != ERR_SUCCESS) continue;
|
|
|
|
|
|
file_instance_t *file = block->section->file;
|
|
|
- acquire_resource_exclusive(&file->global->volume->resource);
|
|
|
+ lock_acquire(&file->global->volume->lock);
|
|
|
ret = file->global->volume->driver->write_file(file, buffer, shared->offset, PAGE_SIZE, &bytes_written);
|
|
|
- release_resource(&file->global->volume->resource);
|
|
|
+ lock_release(&file->global->volume->lock);
|
|
|
if (ret != ERR_SUCCESS) break;
|
|
|
}
|
|
|
|
|
|
cleanup:
|
|
|
- release_resource(&proc->memory_space.resource);
|
|
|
+ lock_release(&proc->memory_space.lock);
|
|
|
dereference(&proc->header);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1997,9 +1998,9 @@ sysret_t syscall_add_page_file(const char *path, dword_t max_entries)
|
|
|
goto cleanup;
|
|
|
}
|
|
|
|
|
|
- acquire_lock(&page_store_lock);
|
|
|
+ lock_acquire(&page_store_lock);
|
|
|
list_append(&page_stores, &store->link);
|
|
|
- release_lock(&page_store_lock);
|
|
|
+ lock_release(&page_store_lock);
|
|
|
|
|
|
cleanup:
|
|
|
if (get_previous_mode() == USER_MODE) free(safe_path);
|
|
@@ -2034,7 +2035,7 @@ sysret_t syscall_remove_page_file(const char *path)
|
|
|
list_entry_t *ptr;
|
|
|
page_store_t *store;
|
|
|
|
|
|
- acquire_lock(&page_store_lock);
|
|
|
+ lock_acquire(&page_store_lock);
|
|
|
|
|
|
for (ptr = page_stores.next; ptr != &page_stores; ptr = ptr->next)
|
|
|
{
|
|
@@ -2066,12 +2067,12 @@ sysret_t syscall_remove_page_file(const char *path)
|
|
|
if (ptr == &page_stores)
|
|
|
{
|
|
|
ret = ERR_NOTFOUND;
|
|
|
- release_lock(&page_store_lock);
|
|
|
+ lock_release(&page_store_lock);
|
|
|
goto cleanup;
|
|
|
}
|
|
|
|
|
|
list_remove(&store->link);
|
|
|
- release_lock(&page_store_lock);
|
|
|
+ lock_release(&page_store_lock);
|
|
|
|
|
|
for (ptr = store->entry_list.next; ptr != &store->entry_list; ptr = ptr->next)
|
|
|
{
|
|
@@ -2084,7 +2085,7 @@ sysret_t syscall_remove_page_file(const char *path)
|
|
|
ret = syscall_read_file(store->file_handle, buffer, (qword_t)entry->number * (qword_t)PAGE_SIZE, PAGE_SIZE, &bytes_read);
|
|
|
if (ret != ERR_SUCCESS) break;
|
|
|
|
|
|
- acquire_resource_exclusive(&entry->address_space->resource);
|
|
|
+ lock_acquire(&entry->address_space->lock);
|
|
|
memory_block_t *block = find_block_by_addr(entry->address_space, entry->address);
|
|
|
|
|
|
if (block->flags & MEMORY_BLOCK_ACCESSIBLE) page_flags |= PAGE_PRESENT;
|
|
@@ -2128,7 +2129,7 @@ sysret_t syscall_remove_page_file(const char *path)
|
|
|
|
|
|
loop_cleanup:
|
|
|
if (entry->address_space != &kernel_address_space) switch_process(old_process);
|
|
|
- release_resource(&entry->address_space->resource);
|
|
|
+ lock_release(&entry->address_space->lock);
|
|
|
}
|
|
|
|
|
|
free(store);
|
|
@@ -2136,9 +2137,9 @@ loop_cleanup:
|
|
|
cleanup:
|
|
|
if (ret != ERR_SUCCESS)
|
|
|
{
|
|
|
- acquire_lock(&page_store_lock);
|
|
|
+ lock_acquire(&page_store_lock);
|
|
|
list_append(&page_stores, &store->link);
|
|
|
- release_lock(&page_store_lock);
|
|
|
+ lock_release(&page_store_lock);
|
|
|
}
|
|
|
|
|
|
if (get_previous_mode() == USER_MODE) free(safe_path);
|
|
@@ -2173,7 +2174,7 @@ dword_t create_address_space(void *base_address, dword_t page_count, memory_addr
|
|
|
mem_space->pool_size = page_count;
|
|
|
AVL_TREE_INIT(&mem_space->by_addr_tree, memory_block_t, by_addr_node, address, compare_address);
|
|
|
AVL_TREE_INIT(&mem_space->by_size_tree, memory_block_t, by_size_node, size, compare_size);
|
|
|
- mem_space->resource = 0;
|
|
|
+ lock_init(&mem_space->lock);
|
|
|
list_init(&mem_space->evictable_blocks);
|
|
|
mem_space->evict_blk_ptr = NULL;
|
|
|
mem_space->evict_page_num = 0;
|
|
@@ -2220,13 +2221,13 @@ dword_t clone_address_space(memory_address_space_t *original, memory_address_spa
|
|
|
dword_t i;
|
|
|
dword_t ret = ERR_SUCCESS;
|
|
|
|
|
|
- acquire_resource_shared(&original->resource);
|
|
|
+ lock_acquire_shared(&original->lock);
|
|
|
|
|
|
clone->pool_address = original->pool_address;
|
|
|
clone->pool_size = original->pool_size;
|
|
|
AVL_TREE_INIT(&clone->by_addr_tree, memory_block_t, by_addr_node, address, NULL);
|
|
|
AVL_TREE_INIT(&clone->by_size_tree, memory_block_t, by_size_node, size, NULL);
|
|
|
- clone->resource = 0;
|
|
|
+ lock_init(&clone->lock);
|
|
|
list_init(&clone->evictable_blocks);
|
|
|
clone->evict_blk_ptr = NULL;
|
|
|
clone->evict_page_num = 0;
|
|
@@ -2271,7 +2272,7 @@ dword_t clone_address_space(memory_address_space_t *original, memory_address_spa
|
|
|
list_append(&user_address_spaces, &clone->link);
|
|
|
|
|
|
cleanup:
|
|
|
- release_resource(&original->resource);
|
|
|
+ lock_release(&original->lock);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -2284,7 +2285,7 @@ void bump_address_space(memory_address_space_t *mem_space)
|
|
|
void delete_address_space(memory_address_space_t *mem_space)
|
|
|
{
|
|
|
ASSERT(get_page_directory() != mem_space->page_directory);
|
|
|
- acquire_resource_exclusive(&mem_space->resource);
|
|
|
+ lock_acquire(&mem_space->lock);
|
|
|
|
|
|
if (mem_space->by_addr_tree.root)
|
|
|
{
|
|
@@ -2296,7 +2297,7 @@ void delete_address_space(memory_address_space_t *mem_space)
|
|
|
free_physical_page(mem_space->page_directory);
|
|
|
mem_space->page_directory = NULL;
|
|
|
|
|
|
- release_resource(&mem_space->resource);
|
|
|
+ lock_release(&mem_space->lock);
|
|
|
}
|
|
|
|
|
|
static bool_t find_evicted_page(memory_block_t *block, void *address, page_store_t **store, page_store_entry_t **entry)
|
|
@@ -2474,9 +2475,9 @@ bool_t memory_fault_handler(void *address, registers_t *regs)
|
|
|
{
|
|
|
enable_ints();
|
|
|
file_instance_t *file = block->section->file;
|
|
|
- acquire_resource_shared(&file->global->volume->resource);
|
|
|
+ lock_acquire_shared(&file->global->volume->lock);
|
|
|
dword_t ret = file->global->volume->driver->read_file(file, buffer, offset, PAGE_SIZE, &bytes_read);
|
|
|
- release_resource(&file->global->volume->resource);
|
|
|
+ lock_release(&file->global->volume->lock);
|
|
|
disable_ints();
|
|
|
if (ret != ERR_SUCCESS && ret != ERR_BEYOND) return FALSE;
|
|
|
}
|