--- Gnu-Mach/device/dev_pager.c 2020/09/02 04:36:57 1.1 +++ Gnu-Mach/device/dev_pager.c 2020/09/02 04:54:17 1.1.1.6 @@ -1,25 +1,25 @@ -/* +/* * Mach Operating System * Copyright (c) 1993-1989 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ @@ -29,7 +29,8 @@ * * Device pager. */ -#include + +#include #include #include @@ -40,20 +41,22 @@ #include #include +#include +#include #include -#include -#include +#include #include #include +#include #include #include #include #include - -extern vm_offset_t block_io_mmap(); /* dummy routine to allow - mmap for block devices */ +#include +#include +#include /* * The device pager routines are called directly from the message @@ -121,16 +124,16 @@ typedef struct dev_pager *dev_pager_t; #define DEV_PAGER_NULL ((dev_pager_t)0) -zone_t dev_pager_zone; +struct kmem_cache dev_pager_cache; -void dev_pager_reference(register dev_pager_t ds) +void dev_pager_reference(dev_pager_t ds) { simple_lock(&ds->lock); ds->ref_count++; simple_unlock(&ds->lock); } -void dev_pager_deallocate(register dev_pager_t ds) +void dev_pager_deallocate(dev_pager_t ds) { simple_lock(&ds->lock); if (--ds->ref_count > 0) { @@ -139,7 +142,7 @@ void dev_pager_deallocate(register dev_p } simple_unlock(&ds->lock); - zfree(dev_pager_zone, (vm_offset_t)ds); + kmem_cache_free(&dev_pager_cache, (vm_offset_t)ds); } /* @@ -156,37 +159,33 @@ struct dev_pager_entry { typedef struct dev_pager_entry *dev_pager_entry_t; queue_head_t dev_pager_hashtable[DEV_PAGER_HASH_COUNT]; -zone_t dev_pager_hash_zone; +struct kmem_cache dev_pager_hash_cache; decl_simple_lock_data(, dev_pager_hash_lock) #define dev_pager_hash(name_port) \ - (((natural_t)(name_port) & 0xffffff) % DEV_PAGER_HASH_COUNT) + (((vm_offset_t)(name_port) & 0xffffff) % DEV_PAGER_HASH_COUNT) void dev_pager_hash_init(void) { - register int i; - register vm_size_t size; + int i; + vm_size_t size; size = sizeof(struct dev_pager_entry); - dev_pager_hash_zone = zinit( - size, - size * 1000, - PAGE_SIZE, - FALSE, - "dev_pager port hash"); + kmem_cache_init(&dev_pager_hash_cache, "dev_pager_entry", size, 0, + NULL, 0); for (i = 0; i < DEV_PAGER_HASH_COUNT; i++) queue_init(&dev_pager_hashtable[i]); simple_lock_init(&dev_pager_hash_lock); } void dev_pager_hash_insert( - ipc_port_t name_port, - dev_pager_t rec) + const ipc_port_t name_port, + const dev_pager_t rec) { - register dev_pager_entry_t new_entry; + dev_pager_entry_t new_entry; - new_entry = (dev_pager_entry_t) zalloc(dev_pager_hash_zone); + new_entry = (dev_pager_entry_t) kmem_cache_alloc(&dev_pager_hash_cache); new_entry->name = name_port; new_entry->pager_rec = rec; @@ -196,10 +195,10 @@ void dev_pager_hash_insert( simple_unlock(&dev_pager_hash_lock); } -void dev_pager_hash_delete(ipc_port_t name_port) +void dev_pager_hash_delete(const ipc_port_t name_port) { - register queue_t bucket; - register dev_pager_entry_t entry; + queue_t bucket; + dev_pager_entry_t entry; bucket = &dev_pager_hashtable[dev_pager_hash(name_port)]; @@ -214,14 +213,14 @@ void dev_pager_hash_delete(ipc_port_t na } simple_unlock(&dev_pager_hash_lock); if (entry) - zfree(dev_pager_hash_zone, (vm_offset_t)entry); + kmem_cache_free(&dev_pager_hash_cache, (vm_offset_t)entry); } -dev_pager_t dev_pager_hash_lookup(ipc_port_t name_port) +dev_pager_t dev_pager_hash_lookup(const ipc_port_t name_port) { - register queue_t bucket; - register dev_pager_entry_t entry; - register dev_pager_t pager; + queue_t bucket; + dev_pager_entry_t entry; + dev_pager_t pager; bucket = &dev_pager_hashtable[dev_pager_hash(name_port)]; @@ -241,13 +240,13 @@ dev_pager_t dev_pager_hash_lookup(ipc_po } kern_return_t device_pager_setup( - mach_device_t device, - int prot, - vm_offset_t offset, - vm_size_t size, - mach_port_t *pager) + const mach_device_t device, + int prot, + vm_offset_t offset, + vm_size_t size, + mach_port_t *pager) { - register dev_pager_t d; + dev_pager_t d; /* * Verify the device is indeed mappable @@ -267,7 +266,7 @@ kern_return_t device_pager_setup( return (D_SUCCESS); } - d = (dev_pager_t) zalloc(dev_pager_zone); + d = (dev_pager_t) kmem_cache_alloc(&dev_pager_cache); if (d == DEV_PAGER_NULL) return (KERN_RESOURCE_SHORTAGE); @@ -318,28 +317,20 @@ void device_pager_release(memory_object_ boolean_t device_pager_debug = FALSE; -boolean_t device_pager_data_request_done(); /* forward */ -boolean_t device_pager_data_write_done(); /* forward */ - - kern_return_t device_pager_data_request( - ipc_port_t pager, - ipc_port_t pager_request, - vm_offset_t offset, - vm_size_t length, - vm_prot_t protection_required) -{ - register dev_pager_t ds; - -#ifdef lint - protection_required++; -#endif lint + const ipc_port_t pager, + const ipc_port_t pager_request, + vm_offset_t offset, + vm_size_t length, + vm_prot_t protection_required) +{ + dev_pager_t ds; if (device_pager_debug) - printf("(device_pager)data_request: pager=%d, offset=0x%x, length=0x%x\n", + printf("(device_pager)data_request: pager=%p, offset=0x%lx, length=0x%x\n", pager, offset, length); - ds = dev_pager_hash_lookup((ipc_port_t)pager); + ds = dev_pager_hash_lookup(pager); if (ds == DEV_PAGER_NULL) panic("(device_pager)data_request: lookup failed"); @@ -347,14 +338,9 @@ kern_return_t device_pager_data_request( panic("(device_pager)data_request: bad pager_request"); if (ds->type == CHAR_PAGER_TYPE) { - register vm_object_t object; - vm_offset_t device_map_page(void *,vm_offset_t); + vm_object_t object; -#if NORMA_VM - object = vm_object_lookup(pager); -#else NORMA_VM object = vm_object_lookup(pager_request); -#endif NORMA_VM if (object == VM_OBJECT_NULL) { (void) r_memory_object_data_error(pager_request, offset, length, @@ -365,50 +351,12 @@ kern_return_t device_pager_data_request( vm_object_page_map(object, offset, length, - device_map_page, (char *)ds); + device_map_page, (void *)ds); vm_object_deallocate(object); } else { - register io_req_t ior; - register mach_device_t device; - io_return_t result; - panic("(device_pager)data_request: dev pager"); - - device = ds->device; - mach_device_reference(device); - dev_pager_deallocate(ds); - - /* - * Package the read for the device driver. - */ - io_req_alloc(ior, 0); - - ior->io_device = device; - ior->io_unit = device->dev_number; - ior->io_op = IO_READ | IO_CALL; - ior->io_mode = 0; - ior->io_recnum = offset / device->bsize; - ior->io_data = 0; /* driver must allocate */ - ior->io_count = length; - ior->io_alloc_size = 0; /* no data allocated yet */ - ior->io_residual = 0; - ior->io_error = 0; - ior->io_done = device_pager_data_request_done; - ior->io_reply_port = pager_request; - ior->io_reply_port_type = MACH_MSG_TYPE_PORT_SEND; - - result = (*device->dev_ops->d_read)(device->dev_number, ior); - if (result == D_IO_QUEUED) - return (KERN_SUCCESS); - - /* - * Return by queuing IOR for io_done thread, to reply in - * correct environment (kernel). - */ - ior->io_error = result; - iodone(ior); } dev_pager_deallocate(ds); @@ -416,141 +364,20 @@ kern_return_t device_pager_data_request( return (KERN_SUCCESS); } -/* - * Always called by io_done thread. - */ -boolean_t device_pager_data_request_done(register io_req_t ior) -{ - vm_offset_t start_alloc, end_alloc; - vm_size_t size_read; - - if (ior->io_error == D_SUCCESS) { - size_read = ior->io_count; - if (ior->io_residual) { - if (device_pager_debug) - printf("(device_pager)data_request_done: r: 0x%x\n",ior->io_residual); - bzero( (char *) (&ior->io_data[ior->io_count - - ior->io_residual]), - (unsigned) ior->io_residual); - } - } else { - size_read = ior->io_count - ior->io_residual; - } - - start_alloc = trunc_page((vm_offset_t)ior->io_data); - end_alloc = start_alloc + round_page(ior->io_alloc_size); - - if (ior->io_error == D_SUCCESS) { - vm_map_copy_t copy; - kern_return_t kr; - - kr = vm_map_copyin(kernel_map, (vm_offset_t)ior->io_data, - size_read, TRUE, ©); - if (kr != KERN_SUCCESS) - panic("device_pager_data_request_done"); - - (void) r_memory_object_data_provided( - ior->io_reply_port, - ior->io_recnum * ior->io_device->bsize, - (vm_offset_t)copy, - size_read, - VM_PROT_NONE); - } - else { - (void) r_memory_object_data_error( - ior->io_reply_port, - ior->io_recnum * ior->io_device->bsize, - (vm_size_t)ior->io_count, - ior->io_error); - } - - (void)vm_deallocate(kernel_map, - start_alloc, - end_alloc - start_alloc); - mach_device_deallocate(ior->io_device); - return (TRUE); -} - -kern_return_t device_pager_data_write( - ipc_port_t pager, - ipc_port_t pager_request, - register vm_offset_t offset, - register pointer_t addr, - vm_size_t data_count) -{ - register dev_pager_t ds; - register mach_device_t device; - register io_req_t ior; - kern_return_t result; - - panic("(device_pager)data_write: called"); - - ds = dev_pager_hash_lookup((ipc_port_t)pager); - if (ds == DEV_PAGER_NULL) - panic("(device_pager)data_write: lookup failed"); - - if (ds->pager_request != pager_request) - panic("(device_pager)data_write: bad pager_request"); - - if (ds->type == CHAR_PAGER_TYPE) - panic("(device_pager)data_write: char pager"); - - device = ds->device; - mach_device_reference(device); - dev_pager_deallocate(ds); - - /* - * Package the write request for the device driver. - */ - io_req_alloc(ior, data_count); - - ior->io_device = device; - ior->io_unit = device->dev_number; - ior->io_op = IO_WRITE | IO_CALL; - ior->io_mode = 0; - ior->io_recnum = offset / device->bsize; - ior->io_data = (io_buf_ptr_t)addr; - ior->io_count = data_count; - ior->io_alloc_size = data_count; /* amount to deallocate */ - ior->io_residual = 0; - ior->io_error = 0; - ior->io_done = device_pager_data_write_done; - ior->io_reply_port = IP_NULL; - - result = (*device->dev_ops->d_write)(device->dev_number, ior); - - if (result != D_IO_QUEUED) { - device_write_dealloc(ior); - io_req_free((vm_offset_t)ior); - mach_device_deallocate(device); - } - - return (KERN_SUCCESS); -} - -boolean_t device_pager_data_write_done(ior) - register io_req_t ior; -{ - device_write_dealloc(ior); - mach_device_deallocate(ior->io_device); - - return (TRUE); -} - kern_return_t device_pager_copy( - ipc_port_t pager, - ipc_port_t pager_request, - register vm_offset_t offset, - register vm_size_t length, - ipc_port_t new_pager) + const ipc_port_t pager, + const ipc_port_t pager_request, + vm_offset_t offset, + vm_size_t length, + const ipc_port_t new_pager) { panic("(device_pager)copy: called"); } kern_return_t device_pager_supply_completed( - ipc_port_t pager, - ipc_port_t pager_request, + const ipc_port_t pager, + const ipc_port_t pager_request, vm_offset_t offset, vm_size_t length, kern_return_t result, @@ -561,10 +388,10 @@ device_pager_supply_completed( kern_return_t device_pager_data_return( - ipc_port_t pager, - ipc_port_t pager_request, + const ipc_port_t pager, + const ipc_port_t pager_request, vm_offset_t offset, - register pointer_t addr, + pointer_t addr, vm_size_t data_cnt, boolean_t dirty, boolean_t kernel_copy) @@ -574,7 +401,7 @@ device_pager_data_return( kern_return_t device_pager_change_completed( - ipc_port_t pager, + const ipc_port_t pager, boolean_t may_cache, memory_object_copy_strategy_t copy_strategy) { @@ -591,7 +418,7 @@ vm_offset_t device_map_page( void *dsp, vm_offset_t offset) { - register dev_pager_t ds = (dev_pager_t) dsp; + dev_pager_t ds = (dev_pager_t) dsp; return pmap_phys_address( (*(ds->device->dev_ops->d_mmap)) @@ -599,15 +426,15 @@ vm_offset_t device_map_page( } kern_return_t device_pager_init_pager( - ipc_port_t pager, - ipc_port_t pager_request, - ipc_port_t pager_name, - vm_size_t pager_page_size) + const ipc_port_t pager, + const ipc_port_t pager_request, + const ipc_port_t pager_name, + vm_size_t pager_page_size) { - register dev_pager_t ds; + dev_pager_t ds; if (device_pager_debug) - printf("(device_pager)init: pager=%d, request=%d, name=%d\n", + printf("(device_pager)init: pager=%p, request=%p, name=%p\n", pager, pager_request, pager_name); assert(pager_page_size == PAGE_SIZE); @@ -634,15 +461,13 @@ kern_return_t device_pager_init_pager( /* * Reply that the object is ready */ - (void) r_memory_object_set_attributes(pager_request, - TRUE, /* ready */ - FALSE, /* do not cache */ - MEMORY_OBJECT_COPY_NONE); + (void) r_memory_object_ready(pager_request, + FALSE, /* do not cache */ + MEMORY_OBJECT_COPY_NONE); } else { - (void) r_memory_object_set_attributes(pager_request, - TRUE, /* ready */ - TRUE, /* cache */ - MEMORY_OBJECT_COPY_DELAY); + (void) r_memory_object_ready(pager_request, + TRUE, /* cache */ + MEMORY_OBJECT_COPY_DELAY); } dev_pager_deallocate(ds); @@ -650,11 +475,11 @@ kern_return_t device_pager_init_pager( } kern_return_t device_pager_terminate( - ipc_port_t pager, - ipc_port_t pager_request, - ipc_port_t pager_name) + const ipc_port_t pager, + const ipc_port_t pager_request, + const ipc_port_t pager_name) { - register dev_pager_t ds; + dev_pager_t ds; assert(IP_VALID(pager_request)); assert(IP_VALID(pager_name)); @@ -692,47 +517,36 @@ kern_return_t device_pager_terminate( } kern_return_t device_pager_data_unlock( - ipc_port_t memory_object, - ipc_port_t memory_control_port, + const ipc_port_t memory_object, + const ipc_port_t memory_control_port, vm_offset_t offset, vm_size_t length, vm_prot_t desired_access) { -#ifdef lint - memory_object++; memory_control_port++; offset++; length++; desired_access++; -#endif lint - panic("(device_pager)data_unlock: called"); return (KERN_FAILURE); } kern_return_t device_pager_lock_completed( - ipc_port_t memory_object, - ipc_port_t pager_request_port, - vm_offset_t offset, - vm_size_t length) -{ -#ifdef lint - memory_object++; pager_request_port++; offset++; length++; -#endif lint - + const ipc_port_t memory_object, + const ipc_port_t pager_request_port, + vm_offset_t offset, + vm_size_t length) +{ panic("(device_pager)lock_completed: called"); return (KERN_FAILURE); } void device_pager_init(void) { - register vm_size_t size; + vm_size_t size; /* - * Initialize zone of paging structures. + * Initialize cache of paging structures. */ size = sizeof(struct dev_pager); - dev_pager_zone = zinit(size, - (vm_size_t) size * 1000, - PAGE_SIZE, - FALSE, - "device pager structures"); + kmem_cache_init(&dev_pager_cache, "dev_pager", size, 0, + NULL, 0); /* * Initialize the name port hashing stuff.