1/* 2 * Copyright 2004-2015 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Jérôme Duval, jerome.duval@free.fr 7 * Marcus Overhagen, marcus@overhagen.de 8 * Jérôme Lévêque, leveque.jerome@gmail.com 9 */ 10 11#include <Errors.h> 12#include <OS.h> 13#include <string.h> 14 15#include <vm/vm.h> 16#include <vm/VMAddressSpace.h> 17 18#include "debug.h" 19#include "util.h" 20 21static spinlock slock = B_SPINLOCK_INITIALIZER; 22 23cpu_status 24lock(void) 25{ 26 cpu_status status = disable_interrupts(); 27 acquire_spinlock(&slock); 28 return status; 29} 30 31 32void 33unlock(cpu_status status) 34{ 35 release_spinlock(&slock); 36 restore_interrupts(status); 37} 38 39 40area_id 41alloc_mem(physical_entry *phy, addr_t *log, size_t size, const char *name) 42{ 43 void * logadr; 44 area_id areaid; 45 status_t rv; 46 virtual_address_restrictions virtualRestrictions = {}; 47 virtualRestrictions.address_specification = B_ANY_KERNEL_ADDRESS; 48 physical_address_restrictions physicalRestrictions = {}; 49 physicalRestrictions.high_address = 1 << 28; 50 // ICE1712 chipset can not deal with memory area beyond 256MB 51 52 ITRACE("Allocating %s: ", name); 53 54 areaid = vm_create_anonymous_area(B_SYSTEM_TEAM, name, size, B_CONTIGUOUS, 55 B_READ_AREA | B_WRITE_AREA, 0, 0, 56 &virtualRestrictions, &physicalRestrictions, true, &logadr); 57 58 if (areaid < B_OK) { 59 ITRACE("couldn't allocate\n"); 60 return B_ERROR; 61 } 62 rv = get_memory_map(logadr, size, phy, 1); 63 if (rv < B_OK) { 64 delete_area(areaid); 65 ITRACE("couldn't map\n"); 66 return B_ERROR; 67 } 68 69 if (log) 70 *log = (addr_t)logadr; 71 72 ITRACE("area = %" B_PRId32 ", size = %" B_PRIuSIZE ", log = 0x%" \ 73 B_PRIXADDR ", phy = 0x%" B_PRIXPHYSADDR "\n", areaid, size, 74 *log, phy->address); 75 76 return areaid; 77} 78 79