Commit 28543033 authored by kaf24's avatar kaf24

bitkeeper revision 1.520 (3f8d13d8qVVqxcYD--4cXYs5egqNyg)

Many files:
  Fix the minos license so that it is usable for XP and BSD ports.
minios.lds:
  Rename: extras/mini-os/vmlinux.lds -> extras/mini-os/minios.lds
.del-list.h~d612a8726e8d42e:
  Delete: extras/mini-os/h/list.h
.del-COPYING~1f9753354580bd13:
  Delete: extras/mini-os/COPYING
parent dc08d299
......@@ -6,7 +6,6 @@
3f5ef5a24IaQasQE2tyMxrfxskMmvw README
3f5ef5a2l4kfBYSQTUaOyyD76WROZQ README.CD
3f69d8abYB1vMyD_QVDvzxy5Zscf1A TODO
3f831e59ioQmSyYPOsQ0z-AtLVXiSg extras/mini-os/COPYING
3f815144d1vI2777JI-dO4wk49Iw7g extras/mini-os/Makefile
3f815144zTnCV5591ulIJQrpe5b-5Q extras/mini-os/README
3f815144wiiDekmfMl9LIPIvhR83Uw extras/mini-os/entry.S
......@@ -14,7 +13,6 @@
3f815144h-Chna6E38yo40jqU95G1Q extras/mini-os/h/events.h
3f8151445bYdgThGHQPeOW49PsrJ_A extras/mini-os/h/hypervisor.h
3f815144f2Vg3qb6tiwt2VZad-DWsg extras/mini-os/h/lib.h
3f815144iqXtdYup_pyfPSmDZuvZcg extras/mini-os/h/list.h
3f81514437EzzRWAnZl4_Ej1oznMjg extras/mini-os/h/mm.h
3f815144nbSjjT1h4m99-QPbeSWY0Q extras/mini-os/h/os.h
3f815144L1t0AevJt2JDXPegv6JTrw extras/mini-os/h/time.h
......@@ -26,10 +24,10 @@
3f815145Mb9WSKjOPsYTLsPIvPyy4Q extras/mini-os/lib/math.c
3f8151454rEuPjN74V2Bcu65RLnM-Q extras/mini-os/lib/printf.c
3f815145MQZrUJV0iRmTK2KIhwB2wg extras/mini-os/lib/string.c
3f815145AYE58Kpmsj5U7oHDpVDZJA extras/mini-os/minios.lds
3f815145CB8XdPUqsmhAjSDFuwOoqA extras/mini-os/mm.c
3f815145vGYx1WY79voKkZB9yKwJKQ extras/mini-os/time.c
3f815145xlKBAQmal9oces3G_Mvxqw extras/mini-os/traps.c
3f815145AYE58Kpmsj5U7oHDpVDZJA extras/mini-os/vmlinux.lds
3f776bd1Hy9rn69ntXBhPReUFw9IEA tools/Makefile
3e6377b24eQqYMsDi9XrFkIgTzZ47A tools/balloon/Makefile
3e6377d6eiFjF1hHIS6JEIOFk62xSA tools/balloon/README
......
This diff is collapsed.
......@@ -21,7 +21,7 @@ hypervisor-ifs:
$(TARGET): hypervisor-ifs head.o $(OBJS)
# Image will load at 0xC0000000. First bytes from head.o
#$(LD) -N -Ttext 0xC0000000 head.o $(OBJS) -o $@.elf
$(LD) -N -T vmlinux.lds head.o $(OBJS) -o $@.elf
$(LD) -N -T minios.lds head.o $(OBJS) -o $@.elf
# Guest OS header -- first 8 bytes are identifier 'XenoGues'.
echo -e -n 'XenoGues' >$@
# Guest OS header -- next 4 bytes are load address (0xC0000000).
......
/*
* linux/arch/i386/entry.S
*
* Copyright (C) 1991, 1992 Linus Torvalds
*
* Adjusted for XenoLinux use by K A Frasier
* Adjusted for Xen minimal os by R Neugebauer
*/
#include <os.h>
EBX = 0x00
ECX = 0x04
EDX = 0x08
ESI = 0x0C
EDI = 0x10
EBP = 0x14
EAX = 0x18
DS = 0x1C
ES = 0x20
ORIG_EAX = 0x24
EIP = 0x28
CS = 0x2C
EFLAGS = 0x30
OLDESP = 0x34
OLDSS = 0x38
CF_MASK = 0x00000001
IF_MASK = 0x00000200
NT_MASK = 0x00004000
/* Declare a globally-visible label */
#define ENTRY(X) .globl X ; X :
/* A Linux hangover. Just ignore it. */
#define SYMBOL_NAME(X) X
#define SAVE_ALL \
cld; \
pushl %es; \
......@@ -59,34 +31,15 @@ NT_MASK = 0x00004000
popl %edi; \
popl %ebp; \
popl %eax; \
1: popl %ds; \
2: popl %es; \
addl $4,%esp; \
3: iret; \
.section .fixup,"ax"; \
4: movl $0,(%esp); \
jmp 1b; \
5: movl $0,(%esp); \
jmp 2b; \
6: pushl %ss; \
popl %ds; \
pushl %ss; \
popl %es; \
pushl $11; \
call do_exit; \
.previous; \
.section __ex_table,"a";\
.align 4; \
.long 1b,4b; \
.long 2b,5b; \
.long 3b,6b; \
.previous
addl $4,%esp; \
iret; \
ENTRY(divide_error)
pushl $0 # no error code
pushl $ SYMBOL_NAME(do_divide_error)
.align 4
error_code:
pushl $do_divide_error
do_exception:
pushl %ds
pushl %eax
xorl %eax,%eax
......@@ -112,20 +65,11 @@ error_code:
call *%edi
addl $8,%esp
# These are the tests Linux makes before exiting the OS back to userland.
# At these point preeemption may occur, or signals may get delivered.
ret_to_user_tests:
# cmpl $0,need_resched(%ebx)
# jne reschedule
# cmpl $0,sigpending(%ebx)
# je safesti
jmp safesti
ret_from_exception:
movb CS(%esp),%cl
test $2,%cl # slow return to ring 2 or 3
jne ret_to_user_tests
test $2,%cl # slow return to ring 2 or 3
jne safesti
RESTORE_ALL
# A note on the "critical region" in our callback handler.
......@@ -150,11 +94,11 @@ ENTRY(hypervisor_callback)
11: push %esp
call do_hypervisor_callback
add $4,%esp
movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi
movl HYPERVISOR_shared_info,%esi
xorl %eax,%eax
movb CS(%esp),%cl
test $2,%cl # slow return to ring 2 or 3
jne ret_to_user_tests
jne safesti
safesti:btsl $31,4(%esi) # reenable event callbacks
scrit: /**** START OF CRITICAL REGION ****/
cmpl %eax,(%esi)
......@@ -207,105 +151,78 @@ critical_fixup_table:
# Hypervisor uses this for application faults while it executes.
ENTRY(failsafe_callback)
1: pop %ds
2: pop %es
3: pop %fs
4: pop %gs
5: iret
.section .fixup,"ax"; \
6: movl $0,(%esp); \
jmp 1b; \
7: movl $0,(%esp); \
jmp 2b; \
8: movl $0,(%esp); \
jmp 3b; \
9: movl $0,(%esp); \
jmp 4b; \
10: pushl %ss; \
popl %ds; \
pushl %ss; \
popl %es; \
pushl $11; \
call do_exit; \
.previous; \
.section __ex_table,"a";\
.align 4; \
.long 1b,6b; \
.long 2b,7b; \
.long 3b,8b; \
.long 4b,9b; \
.long 5b,10b; \
.previous
pop %ds
pop %es
pop %fs
pop %gs
iret
ENTRY(coprocessor_error)
pushl $0
pushl $ SYMBOL_NAME(do_coprocessor_error)
jmp error_code
pushl $do_coprocessor_error
jmp do_exception
ENTRY(simd_coprocessor_error)
pushl $0
pushl $ SYMBOL_NAME(do_simd_coprocessor_error)
jmp error_code
pushl $do_simd_coprocessor_error
jmp do_exception
ENTRY(device_not_available)
pushl $-1 # mark this as an int
SAVE_ALL
#call SYMBOL_NAME(math_state_restore)
jmp ret_from_exception
iret
ENTRY(debug)
pushl $0
pushl $ SYMBOL_NAME(do_debug)
jmp error_code
pushl $do_debug
jmp do_exception
ENTRY(int3)
pushl $0
pushl $ SYMBOL_NAME(do_int3)
jmp error_code
pushl $do_int3
jmp do_exception
ENTRY(overflow)
pushl $0
pushl $ SYMBOL_NAME(do_overflow)
jmp error_code
pushl $do_overflow
jmp do_exception
ENTRY(bounds)
pushl $0
pushl $ SYMBOL_NAME(do_bounds)
jmp error_code
pushl $do_bounds
jmp do_exception
ENTRY(invalid_op)
pushl $0
pushl $ SYMBOL_NAME(do_invalid_op)
jmp error_code
pushl $do_invalid_op
jmp do_exception
ENTRY(coprocessor_segment_overrun)
pushl $0
pushl $ SYMBOL_NAME(do_coprocessor_segment_overrun)
jmp error_code
pushl $do_coprocessor_segment_overrun
jmp do_exception
ENTRY(double_fault)
pushl $ SYMBOL_NAME(do_double_fault)
jmp error_code
pushl $do_double_fault
jmp do_exception
ENTRY(invalid_TSS)
pushl $ SYMBOL_NAME(do_invalid_TSS)
jmp error_code
pushl $do_invalid_TSS
jmp do_exception
ENTRY(segment_not_present)
pushl $ SYMBOL_NAME(do_segment_not_present)
jmp error_code
pushl $do_segment_not_present
jmp do_exception
ENTRY(stack_segment)
pushl $ SYMBOL_NAME(do_stack_segment)
jmp error_code
pushl $do_stack_segment
jmp do_exception
ENTRY(general_protection)
pushl $ SYMBOL_NAME(do_general_protection)
jmp error_code
pushl $do_general_protection
jmp do_exception
ENTRY(alignment_check)
pushl $ SYMBOL_NAME(do_alignment_check)
jmp error_code
pushl $do_alignment_check
jmp do_exception
# This handler is special, because it gets an extra value on its stack,
# which is the linear faulting address.
......@@ -333,16 +250,16 @@ ENTRY(page_fault)
movl $(__KERNEL_DS),%edx
movl %edx,%ds
movl %edx,%es
call SYMBOL_NAME(do_page_fault)
call do_page_fault
addl $12,%esp
jmp ret_from_exception
ENTRY(machine_check)
pushl $0
pushl $ SYMBOL_NAME(do_machine_check)
jmp error_code
pushl $do_machine_check
jmp do_exception
ENTRY(spurious_interrupt_bug)
pushl $0
pushl $ SYMBOL_NAME(do_spurious_interrupt_bug)
jmp error_code
pushl $do_spurious_interrupt_bug
jmp do_exception
......@@ -29,7 +29,7 @@ void default_handler(int ev, struct pt_regs *regs);
/*
* demux events to different handlers
*/
asmlinkage unsigned int do_event(int ev, struct pt_regs *regs)
unsigned int do_event(int ev, struct pt_regs *regs)
{
ev_action_t *action;
......
/******************************************************************************
* hypervisor.h
*
* Linux-specific hypervisor handling.
*
* Adjusted by R Neugebauer for Xen minimal OS
*
* Copyright (c) 2002, K A Fraser
*/
#ifndef _HYPERVISOR_H_
#define _HYPERVISOR_H_
......
#ifndef _LINUX_LIST_H
#define _LINUX_LIST_H
#define ASSERT(x) ((void)0)
/*
* Simple doubly linked list implementation.
*
* Some of the internal functions ("__xxx") are useful when
* manipulating whole lists rather than single entries, as
* sometimes we already know the next/prev entries and we can
* generate better code by using them directly rather than
* using the generic single-entry routines.
*/
struct list_head {
struct list_head *next, *prev;
};
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
/*
* Insert a new entry between two known consecutive entries.
*
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
static __inline__ void __list_add(struct list_head * new,
struct list_head * prev,
struct list_head * next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}
/**
* list_add - add a new entry
* @new: new entry to be added
* @head: list head to add it after
*
* Insert a new entry after the specified head.
* This is good for implementing stacks.
*/
static __inline__ void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}
/**
* list_add_tail - add a new entry
* @new: new entry to be added
* @head: list head to add it before
*
* Insert a new entry before the specified head.
* This is useful for implementing queues.
*/
static __inline__ void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}
/*
* Delete a list entry by making the prev/next entries
* point to each other.
*
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
static __inline__ void __list_del(struct list_head * prev,
struct list_head * next)
{
next->prev = prev;
prev->next = next;
}
/**
* list_del - deletes entry from list.
* @entry: the element to delete from the list.
* Note: list_empty on entry does not return true after this, the entry is in an undefined state.
*/
static __inline__ void list_del(struct list_head *entry)
{
ASSERT(entry->next->prev == entry);
ASSERT(entry->prev->next == entry);
__list_del(entry->prev, entry->next);
}
/**
* list_del_init - deletes entry from list and reinitialize it.
* @entry: the element to delete from the list.
*/
static __inline__ void list_del_init(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
INIT_LIST_HEAD(entry);
}
/**
* list_empty - tests whether a list is empty
* @head: the list to test.
*/
static __inline__ int list_empty(struct list_head *head)
{
return head->next == head;
}
/**
* list_splice - join two lists
* @list: the new list to add.
* @head: the place to add it in the first list.
*/
static __inline__ void list_splice(struct list_head *list, struct list_head *head)
{
struct list_head *first = list->next;
if (first != list) {
struct list_head *last = list->prev;
struct list_head *at = head->next;
first->prev = head;
head->next = first;
last->next = at;
at->prev = last;
}
}
/**
* list_entry - get the struct for this entry
* @ptr: the &struct list_head pointer.
* @type: the type of the struct this is embedded in.
* @member: the name of the list_struct within the struct.
*/
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
/**
* list_for_each - iterate over a list
* @pos: the &struct list_head to use as a loop counter.
* @head: the head for your list.
*/
#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)
/**
* list_for_each_safe - iterate over a list safe against removal of list entry
* @pos: the &struct list_head to use as a loop counter.
* @n: another &struct list_head to use as temporary storage
* @head: the head for your list.
*/
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
#endif
......@@ -15,26 +15,39 @@
****************************************************************************
* $Id: h-insert.h,v 1.4 2002/11/08 16:03:55 rn Exp $
****************************************************************************
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef _MM_H_
#define _MM_H_
/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT 12
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1))
#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
#define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
#define PFN_PHYS(x) ((x) << PAGE_SHIFT)
/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
extern unsigned long *phys_to_machine_mapping;
#define pfn_to_mfn(_pfn) (phys_to_machine_mapping[(_pfn)])
#define mfn_to_pfn(_mfn) (machine_to_phys_mapping[(_mfn)])
......@@ -51,57 +64,12 @@ static inline unsigned long machine_to_phys(unsigned long machine)
return phys;
}
/* VIRT <-> MACHINE conversion */
#define virt_to_machine(_a) (phys_to_machine(__pa(_a)))
#define machine_to_virt(_m) (__va(machine_to_phys(_m)))
/*
* This handles the memory map.. We could make this a config
* option, but too many people screw it up, and too few need
* it.
*
* A __PAGE_OFFSET of 0xC0000000 means that the kernel has
* a virtual address space of one gigabyte, which limits the
* amount of physical memory you can use to about 950MB.
*
* If you want more physical memory than this then see the CONFIG_HIGHMEM4G
* and CONFIG_HIGHMEM64G options in the kernel configuration.
*/
#define __PAGE_OFFSET (0xC0000000)
#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
#define virt_to_page(kaddr) (mem_map + (__pa(kaddr) >> PAGE_SHIFT))
#define VALID_PAGE(page) ((page - mem_map) < max_mapnr)
#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
#define VIRT_START 0xC0000000UL
#define to_phys(x) ((unsigned long)(x)-VIRT_START)
#define to_virt(x) ((void *)((unsigned long)(x)+VIRT_START))
/* prototypes */
void init_mm();
void release_bytes_to_allocator(unsigned long min, unsigned long max);
unsigned long __get_free_pages(int order);
void __free_pages(unsigned long p, int order);
#define get_free_pages(_o) (__get_free_pages(_o))
#define get_free_page() (__get_free_pages(0))
#define free_pages(_p,_o) (__free_pages(_p,_o))
#define free_page(_p) (__free_pages(_p,0))
static __inline__ int get_order(unsigned long size)
{
int order;
size = (size-1) >> (PAGE_SHIFT-1);
order = -1;
do {
size >>= 1;
order++;
} while (size);
return order;
}
unsigned long alloc_pages(int order);
#endif /* _MM_H_ */
......@@ -7,7 +7,6 @@
#ifndef _OS_H_
#define _OS_H_
#define NULL 0
/*
......@@ -126,9 +125,6 @@ do { \
typedef struct { volatile int counter; } atomic_t;
/*
* This XCHG macro is straight from Linux. It is gross.
*/
#define xchg(ptr,v) \
((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
struct __xchg_dummy { unsigned long a[100]; };
......@@ -252,19 +248,6 @@ static __inline__ void atomic_inc(atomic_t *v)
}
/* useful hypervisor macros */
struct desc_struct {
unsigned long a,b;
};
extern struct desc_struct default_ldt[];
#define asmlinkage __attribute__((regparm(0)))
/*
* some random linux macros
*/
#define rdtscll(val) \
__asm__ __volatile__("rdtsc" : "=A" (val))
......
......@@ -20,8 +20,6 @@
#ifndef _TIME_H_
#define _TIME_H_
#include <list.h>
/*
* System Time
* 64 bit value containing the nanoseconds elapsed since boot time.
......
......@@ -2,24 +2,26 @@
* hypervisor.c
*
* Communication to/from hypervisor.
*
* Copied from XenoLinux and adjusted by Rolf.Neugebauer@intel.com
*
* Copyright (c) 2002, K A Fraser
* Copyright (c) 2002-2003, K A Fraser
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <os.h>
......@@ -65,12 +67,6 @@ void do_hypervisor_callback(struct pt_regs *regs)
while ( shared->events );
}
/*
* Define interface to generic handling in irq.c
*/
void enable_hypervisor_event(unsigned int ev)
{
set_bit(ev, &event_mask);
......@@ -89,9 +85,6 @@ void disable_hypervisor_event(unsigned int ev)
void ack_hypervisor_event(unsigned int ev)
{
if ( !(event_mask & (1<<ev)) )
{
//printk("Unexpected hypervisor event %d\n", ev);
atomic_inc((atomic_t *)&ev_err_count);
}
set_bit(ev, &HYPERVISOR_shared_info->events_mask);
}
......@@ -3,6 +3,26 @@
*
* Assorted crap goes here, including the initial C entry point, jumped at
* from head.S.
*
* Copyright (c) 2002-2003, K A Fraser & R Neugebauer
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <os.h>
......
......@@ -51,17 +51,17 @@ static void *more_core(size_t n)
if (n == 0)
return last;