From patchwork Wed Dec 4 16:42:52 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Jones X-Patchwork-Id: 3283701 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 534D99F37C for ; Wed, 4 Dec 2013 16:43:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2387120265 for ; Wed, 4 Dec 2013 16:43:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 60737204EA for ; Wed, 4 Dec 2013 16:43:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932946Ab3LDQnj (ORCPT ); Wed, 4 Dec 2013 11:43:39 -0500 Received: from mx1.redhat.com ([209.132.183.28]:63057 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932921Ab3LDQn1 (ORCPT ); Wed, 4 Dec 2013 11:43:27 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rB4GhAPI010123 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 4 Dec 2013 11:43:11 -0500 Received: from hawk.usersys.redhat.com.com (dhcp-1-158.brq.redhat.com [10.34.1.158]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id rB4Gh3Fw015485; Wed, 4 Dec 2013 11:43:09 -0500 From: Andrew Jones To: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org Subject: [PATCH 4/9] move x86's simple heap management to common code Date: Wed, 4 Dec 2013 17:42:52 +0100 Message-Id: <1386175377-23086-5-git-send-email-drjones@redhat.com> In-Reply-To: <1386175377-23086-1-git-send-email-drjones@redhat.com> References: <1386175377-23086-1-git-send-email-drjones@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Andrew Jones --- config/config-x86-common.mak | 1 + lib/heap.c | 43 +++++++++++++++++++++++++++++++++++++++++++ lib/heap.h | 8 ++++++++ lib/x86/vm.c | 33 ++------------------------------- 4 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 lib/heap.c create mode 100644 lib/heap.h diff --git a/config/config-x86-common.mak b/config/config-x86-common.mak index 917cbbf801a65..8a78f7a6c8849 100644 --- a/config/config-x86-common.mak +++ b/config/config-x86-common.mak @@ -2,6 +2,7 @@ all: test_cases +cflatobjs += lib/heap.o cflatobjs += lib/x86/io.o cflatobjs += lib/x86/smp.o cflatobjs += lib/x86/vm.o diff --git a/lib/heap.c b/lib/heap.c new file mode 100644 index 0000000000000..e52ee0edba163 --- /dev/null +++ b/lib/heap.c @@ -0,0 +1,43 @@ +#include "libcflat.h" + +static size_t pagesize; +static void *free_head; + +void heap_init(void *start, size_t size, size_t page_size) +{ + unsigned long s = (unsigned long)start; + void *p = start; + + pagesize = page_size; + + if (s != (s & ~(pagesize - 1))) { + s += pagesize; + s &= ~(pagesize - 1); + p = (void *)s; + } + + while (size >= pagesize) { + *(void **)p = free_head; + free_head = p; + p += pagesize; + size -= pagesize; + } +} + +void *alloc_page(void) +{ + void *p; + + if (!free_head) + return NULL; + + p = free_head; + free_head = *(void **)free_head; + return p; +} + +void free_page(void *page) +{ + *(void **)page = free_head; + free_head = page; +} diff --git a/lib/heap.h b/lib/heap.h new file mode 100644 index 0000000000000..78b893021ae92 --- /dev/null +++ b/lib/heap.h @@ -0,0 +1,8 @@ +#ifndef _HEAP_H_ +#define _HEAP_H_ +#include "libcflat.h" + +extern void heap_init(void *start, size_t size, size_t page_size); +extern void *alloc_page(void); +extern void free_page(void *page); +#endif diff --git a/lib/x86/vm.c b/lib/x86/vm.c index 188bf57587aa7..725cfe33259c2 100644 --- a/lib/x86/vm.c +++ b/lib/x86/vm.c @@ -1,6 +1,7 @@ #include "fwcfg.h" #include "vm.h" #include "libcflat.h" +#include "heap.h" #define PAGE_SIZE 4096ul #ifdef __x86_64__ @@ -9,38 +10,8 @@ #define LARGE_PAGE_SIZE (1024 * PAGE_SIZE) #endif -static void *free = 0; static void *vfree_top = 0; -static void free_memory(void *mem, unsigned long size) -{ - while (size >= PAGE_SIZE) { - *(void **)mem = free; - free = mem; - mem += PAGE_SIZE; - size -= PAGE_SIZE; - } -} - -void *alloc_page() -{ - void *p; - - if (!free) - return 0; - - p = free; - free = *(void **)free; - - return p; -} - -void free_page(void *page) -{ - *(void **)page = free; - free = page; -} - extern char edata; static unsigned long end_of_memory; @@ -185,7 +156,7 @@ static void setup_mmu(unsigned long len) void setup_vm() { end_of_memory = fwcfg_get_u64(FW_CFG_RAM_SIZE); - free_memory(&edata, end_of_memory - (unsigned long)&edata); + heap_init(&edata, end_of_memory - (unsigned long)&edata, PAGE_SIZE); setup_mmu(end_of_memory); }