diff options
author | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:34:07 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:34:07 +0000 |
commit | 071ea11e85eb9d529cc5eb3d35f6247466a21b99 (patch) | |
tree | 5deda65b8d7b04d1f4cbc534c3206d328e1267ec /sim/ppc/hw_vm.c | |
parent | 1730ec6b1848f0f32154277f788fb29f88d8475b (diff) | |
download | gdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.zip gdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.tar.gz gdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.tar.bz2 |
Initial creation of sourceware repository
Diffstat (limited to 'sim/ppc/hw_vm.c')
-rw-r--r-- | sim/ppc/hw_vm.c | 269 |
1 files changed, 0 insertions, 269 deletions
diff --git a/sim/ppc/hw_vm.c b/sim/ppc/hw_vm.c deleted file mode 100644 index df861d4..0000000 --- a/sim/ppc/hw_vm.c +++ /dev/null @@ -1,269 +0,0 @@ -/* This file is part of the program psim. - - Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au> - - 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. - - 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. - - 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. - - */ - - -#ifndef _HW_VM_C_ -#define _HW_VM_C_ - -#include "device_table.h" -#include "cpu.h" - -#include <signal.h> - -/* DEVICE - - vm - virtual memory device for user simulation modes - - DESCRIPTION - - In user mode, mapped text, data and stack addresses are managed by - the core. Unmapped addresses are passed onto this device (because - it establishes its self as the fallback device) for processing. - - During initialization, children of this device will request the - mapping of the initial text and data segments. Those requests are - passed onto the core device so that that may establish the initial - memory regions. - - Once the simulation has started (as noted above) any access to an - unmapped address range will be passed down to this device as an IO - access. This device will then either attach additional memory to - the core device or signal the access as being invalid. - - The IOCTL function is used to notify this device of any changes to - the users `brk' point. - - PROPERTIES - - stack-base = <number> - - Specifies the lower address of the stack segment in the users - virtual address space. The initial stack page is defined by - stack-base + nr-bytes. - - nr-bytes = <number> - - Specifies the maximum size of the stack segment in the users - address space. - - */ - -typedef struct _hw_vm_device { - /* area of memory valid for stack addresses */ - unsigned_word stack_base; /* min possible stack value */ - unsigned_word stack_bound; - unsigned_word stack_lower_limit; - /* area of memory valid for heap addresses */ - unsigned_word heap_base; - unsigned_word heap_bound; - unsigned_word heap_upper_limit; -} hw_vm_device; - - -static void -hw_vm_init_address_callback(device *me) -{ - hw_vm_device *vm = (hw_vm_device*)device_data(me); - - /* revert the stack/heap variables to their defaults */ - vm->stack_base = device_find_integer_property(me, "stack-base"); - vm->stack_bound = (vm->stack_base - + device_find_integer_property(me, "nr-bytes")); - vm->stack_lower_limit = vm->stack_bound; - vm->heap_base = 0; - vm->heap_bound = 0; - vm->heap_upper_limit = 0; - - /* establish this device as the default memory handler */ - device_attach_address(device_parent(me), - device_name(me), - attach_callback + 1, - 0 /*address space - ignore*/, - 0 /*addr - ignore*/, - (((unsigned)0)-1) /*nr_bytes - ignore*/, - access_read_write /*access*/, - me); -} - - -static void -hw_vm_attach_address(device *me, - const char *name, - attach_type attach, - int space, - unsigned_word addr, - unsigned nr_bytes, - access_type access, - device *who) /*callback/default*/ -{ - hw_vm_device *vm = (hw_vm_device*)device_data(me); - /* update end of bss if necessary */ - if (vm->heap_base < addr + nr_bytes) { - vm->heap_base = addr + nr_bytes; - vm->heap_bound = addr + nr_bytes; - vm->heap_upper_limit = addr + nr_bytes; - } - device_attach_address(device_parent(me), - device_name(me), - attach_raw_memory, - 0 /*address space*/, - addr, - nr_bytes, - access, - me); -} - - -static unsigned -hw_vm_add_space(device *me, - unsigned_word addr, - unsigned nr_bytes, - cpu *processor, - unsigned_word cia) -{ - hw_vm_device *vm = (hw_vm_device*)device_data(me); - unsigned_word block_addr; - unsigned block_nr_bytes; - - /* an address in the stack area, allocate just down to the addressed - page */ - if (addr >= vm->stack_base && addr < vm->stack_lower_limit) { - block_addr = FLOOR_PAGE(addr); - block_nr_bytes = vm->stack_lower_limit - block_addr; - vm->stack_lower_limit = block_addr; - } - /* an address in the heap area, allocate all of the required heap */ - else if (addr >= vm->heap_upper_limit && addr < vm->heap_bound) { - block_addr = vm->heap_upper_limit; - block_nr_bytes = vm->heap_bound - vm->heap_upper_limit; - vm->heap_upper_limit = vm->heap_bound; - } - /* oops - an invalid address - abort the cpu */ - else if (processor != NULL) { - cpu_halt(processor, cia, was_signalled, SIGSEGV); - return 0; - } - /* 2*oops - an invalid address and no processor */ - else { - return 0; - } - - /* got the parameters, allocate the space */ - device_attach_address(device_parent(me), - "vm@0x0,0", /* stop remap */ - attach_raw_memory, - 0 /*address space*/, - block_addr, - block_nr_bytes, - access_read_write, - me); - return block_nr_bytes; -} - - -static unsigned -hw_vm_io_read_buffer_callback(device *me, - void *dest, - int space, - unsigned_word addr, - unsigned nr_bytes, - cpu *processor, - unsigned_word cia) -{ - if (hw_vm_add_space(me, addr, nr_bytes, processor, cia) >= nr_bytes) { - memset(dest, 0, nr_bytes); /* always initialized to zero */ - return nr_bytes; - } - else - return 0; -} - - -static unsigned -hw_vm_io_write_buffer_callback(device *me, - const void *source, - int space, - unsigned_word addr, - unsigned nr_bytes, - cpu *processor, - unsigned_word cia) -{ - if (hw_vm_add_space(me, addr, nr_bytes, processor, cia) >= nr_bytes) { - return device_dma_write_buffer(device_parent(me), source, - space, addr, - nr_bytes, - 0/*violate_read_only*/); - } - else - return 0; -} - - -static int -hw_vm_ioctl_callback(device *me, - cpu *processor, - unsigned_word cia, - va_list ap) -{ - /* While the caller is notified that the heap has grown by the - requested amount, the heap is actually extended out to a page - boundary. */ - hw_vm_device *vm = (hw_vm_device*)device_data(me); - unsigned_word requested_break = va_arg(ap, unsigned_word); - unsigned_word new_break = ALIGN_8(requested_break); - unsigned_word old_break = vm->heap_bound; - signed_word delta = new_break - old_break; - if (delta > 0) - vm->heap_bound = ALIGN_PAGE(new_break); - return 0; -} - - -static device_callbacks const hw_vm_callbacks = { - { hw_vm_init_address_callback, }, - { hw_vm_attach_address, - passthrough_device_address_detach, }, - { hw_vm_io_read_buffer_callback, - hw_vm_io_write_buffer_callback, }, - { NULL, passthrough_device_dma_write_buffer, }, - { NULL, }, /* interrupt */ - { generic_device_unit_decode, - generic_device_unit_encode, }, - NULL, /* instance */ - hw_vm_ioctl_callback, -}; - - -static void * -hw_vm_create(const char *name, - const device_unit *address, - const char *args, - device *parent) -{ - hw_vm_device *vm = ZALLOC(hw_vm_device); - return vm; -} - -const device_descriptor hw_vm_device_descriptor[] = { - { "vm", hw_vm_create, &hw_vm_callbacks }, - { NULL }, -}; - -#endif _HW_VM_C_ |