* i386/i386/io_map.c: code is unused. * i386/i386/io_perm.c: include mig prototypes. * i386/i386/mp_desc.c: Deleted interrupt_stack_alloc since it is not used. * i386/i386/seg.h: Moved descriptor structs to i386/include/mach/i386/mach_i386_types.h as that represents the interface types for RPCs. Defined aliases for real_descriptor since those are used by the i386 RPCs. Inlined many functions here too and removed seg.c. * i386/i386/seg.c: Removed. All the functions are inline now. * i386/i386/trap.c: Use static. * i386/i386/trap.h: Define missing prototypes. * i386/i386/tss.h: Use static inline for ltr. * i386/i386/user_ldt.c: Include mig prototypes. * i386/include/mach/i386/mach_i386.defs: Define real_descriptor_t types since those are used in the RPC definition. Now both prototypes and definitions will match. * i386/include/mach/i386/mach_i386_types.h: Move struct descriptor from seg.h since we need those for the RPC interfaces. Removed include of io_perm.h since it generates circular includes otherwise. * i386/intel/pmap.c: pmap_map is unused. Added static qualifier for several functions. * i386/intel/pmap.h: pmap_update_interrupt declared for non-SMP and SMP. --- i386/Makefrag.am | 2 - i386/i386/io_map.c | 92 ------------------------ i386/i386/io_perm.c | 2 + i386/i386/mp_desc.c | 53 +------------- i386/i386/seg.c | 5 -- i386/i386/seg.h | 42 ++--------- i386/i386/trap.c | 2 +- i386/i386/trap.h | 20 ++++++ i386/i386/tss.h | 2 +- i386/i386/user_ldt.c | 1 + i386/include/mach/i386/mach_i386.defs | 13 ++-- i386/include/mach/i386/mach_i386_types.h | 49 ++++++++++--- i386/intel/pmap.c | 32 ++------- i386/intel/pmap.h | 3 +- 14 files changed, 89 insertions(+), 229 deletions(-) delete mode 100644 i386/i386/io_map.c delete mode 100644 i386/i386/seg.c
diff --git a/i386/Makefrag.am b/i386/Makefrag.am index c1043c4f..0d9b084d 100644 --- a/i386/Makefrag.am +++ b/i386/Makefrag.am @@ -140,7 +140,6 @@ libkernel_a_SOURCES += \ i386/i386/pmap.h \ i386/i386/proc_reg.h \ i386/i386/sched_param.h \ - i386/i386/seg.c \ i386/i386/seg.h \ i386/i386/setjmp.h \ i386/i386/smp.h \ @@ -169,7 +168,6 @@ libkernel_a_SOURCES += \ i386/i386/apic.c \ i386/i386/hardclock.c \ i386/i386/hardclock.h \ - i386/i386/io_map.c \ i386/i386/irq.c \ i386/i386/irq.h \ i386/i386/pit.c \ diff --git a/i386/i386/io_map.c b/i386/i386/io_map.c deleted file mode 100644 index 368f200b..00000000 --- a/i386/i386/io_map.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 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.distribut...@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. - */ - -#include <kern/printf.h> -#include <mach/vm_param.h> -#include <vm/pmap.h> -#include <vm/vm_kern.h> -#include <vm/vm_map.h> - -extern vm_offset_t kernel_virtual_start; - -/* - * Allocate and map memory for devices that may need to be mapped before - * Mach VM is running. - */ -static vm_offset_t -io_map( - phys_addr_t phys_addr, - vm_size_t size) -{ - vm_offset_t start; - - if (kernel_map == VM_MAP_NULL) { - /* - * VM is not initialized. Grab memory. - */ - start = kernel_virtual_start; - kernel_virtual_start += round_page(size); - printf("stealing kernel virtual addresses %08zx-%08zx\n", start, kernel_virtual_start); - } - else { - (void) kmem_alloc_pageable(kernel_map, &start, round_page(size)); - } - (void) pmap_map_bd(start, phys_addr, phys_addr + round_page(size), - VM_PROT_READ|VM_PROT_WRITE); - return (start); -} - -/* - * Allocate and map memory for devices that may need to be mapped before - * Mach VM is running. - * - * This maps the all pages containing [PHYS_ADDR:PHYS_ADDR + SIZE]. - * For contiguous requests to those pages will reuse the previously - * established mapping. - * - * Warning: this leaks memory maps for now, do not use it yet for something - * else than Mach shutdown. - */ -vm_offset_t -io_map_cached( - phys_addr_t phys_addr, - vm_size_t size) -{ - static phys_addr_t base; - static vm_size_t length; - static vm_offset_t map; - - if (! map - || (phys_addr < base) - || (base + length < phys_addr + size)) - { - base = trunc_phys(phys_addr); - length = round_phys(phys_addr - base + size); - map = io_map(base, length); - } - - return map + (phys_addr - base); -} diff --git a/i386/i386/io_perm.c b/i386/i386/io_perm.c index 6db60f73..aabff49b 100644 --- a/i386/i386/io_perm.c +++ b/i386/i386/io_perm.c @@ -64,6 +64,8 @@ #include <device/device_emul.h> #include <device/device_port.h> +#include <i386/i386/mach_i386.server.h> + #include "io_perm.h" #include "gdt.h" #include "pcb.h" diff --git a/i386/i386/mp_desc.c b/i386/i386/mp_desc.c index 1e9ea0fc..bcf2fbe7 100644 --- a/i386/i386/mp_desc.c +++ b/i386/i386/mp_desc.c @@ -167,59 +167,10 @@ mp_desc_init(int mycpu) } } -kern_return_t intel_startCPU(int slot_num) +static kern_return_t intel_startCPU(int slot_num) { printf("TODO: intel_startCPU\n"); -} - -/* - * Called after all CPUs have been found, but before the VM system - * is running. The machine array must show which CPUs exist. - */ -void -interrupt_stack_alloc(void) -{ - int i; - int cpu_count; - vm_offset_t stack_start; - - /* - * Count the number of CPUs. - */ - cpu_count = 0; - for (i = 0; i < NCPUS; i++) - if (machine_slot[i].is_cpu) - cpu_count++; - - /* - * Allocate an interrupt stack for each CPU except for - * the master CPU (which uses the bootstrap stack) - */ - if (!init_alloc_aligned(INTSTACK_SIZE*(cpu_count-1), &stack_start)) - panic("not enough memory for interrupt stacks"); - stack_start = phystokv(stack_start); - - /* - * Set up pointers to the top of the interrupt stack. - */ - for (i = 0; i < NCPUS; i++) { - if (i == master_cpu) { - interrupt_stack[i] = (vm_offset_t) _intstack; - int_stack_top[i] = (vm_offset_t) _eintstack; - } - else if (machine_slot[i].is_cpu) { - interrupt_stack[i] = stack_start; - int_stack_top[i] = stack_start + INTSTACK_SIZE; - - stack_start += INTSTACK_SIZE; - } - } - - /* - * Set up the barrier address. All thread stacks MUST - * be above this address. - */ - int_stack_high = stack_start; + return KERN_FAILURE; } /* XXX should be adjusted per CPU speed */ diff --git a/i386/i386/seg.c b/i386/i386/seg.c deleted file mode 100644 index d57c255e..00000000 --- a/i386/i386/seg.c +++ /dev/null @@ -1,5 +0,0 @@ - -#define MACH_INLINE -#include "seg.h" -#include "tss.h" - diff --git a/i386/i386/seg.h b/i386/i386/seg.h index 30cfdc86..74853718 100644 --- a/i386/i386/seg.h +++ b/i386/i386/seg.h @@ -32,6 +32,7 @@ #define _I386_SEG_H_ #include <mach/inline.h> +#include <mach/machine/mach_i386_types.h> /* * i386 segmentation. @@ -46,35 +47,6 @@ #ifndef __ASSEMBLER__ -/* - * Real segment descriptor. - */ -struct real_descriptor { - unsigned int limit_low:16, /* limit 0..15 */ - base_low:16, /* base 0..15 */ - base_med:8, /* base 16..23 */ - access:8, /* access byte */ - limit_high:4, /* limit 16..19 */ - granularity:4, /* granularity */ - base_high:8; /* base 24..31 */ -}; - -#ifdef __x86_64__ -struct real_descriptor64 { - unsigned int limit_low:16, /* limit 0..15 */ - base_low:16, /* base 0..15 */ - base_med:8, /* base 16..23 */ - access:8, /* access byte */ - limit_high:4, /* limit 16..19 */ - granularity:4, /* granularity */ - base_high:8, /* base 24..31 */ - base_ext:32, /* base 32..63 */ - reserved1:8, - zero:5, - reserved2:19; -}; -#endif - struct real_gate { unsigned int offset_low:16, /* offset 0..15 */ selector:16, @@ -156,15 +128,15 @@ struct pseudo_descriptor /* Load the processor's IDT, GDT, or LDT pointers. */ -MACH_INLINE void lgdt(struct pseudo_descriptor *pdesc) +static inline void lgdt(struct pseudo_descriptor *pdesc) { __asm volatile("lgdt %0" : : "m" (*pdesc)); } -MACH_INLINE void lidt(struct pseudo_descriptor *pdesc) +static inline void lidt(struct pseudo_descriptor *pdesc) { __asm volatile("lidt %0" : : "m" (*pdesc)); } -MACH_INLINE void lldt(unsigned short ldt_selector) +static inline void lldt(unsigned short ldt_selector) { __asm volatile("lldt %w0" : : "r" (ldt_selector) : "memory"); } @@ -177,7 +149,7 @@ MACH_INLINE void lldt(unsigned short ldt_selector) /* Fill a segment descriptor. */ -MACH_INLINE void +static inline void fill_descriptor(struct real_descriptor *_desc, unsigned base, unsigned limit, unsigned char access, unsigned char sizebits) { @@ -206,7 +178,7 @@ fill_descriptor(struct real_descriptor *_desc, unsigned base, unsigned limit, } #ifdef __x86_64__ -MACH_INLINE void +static inline void fill_descriptor64(struct real_descriptor64 *_desc, unsigned long base, unsigned limit, unsigned char access, unsigned char sizebits) { @@ -240,7 +212,7 @@ fill_descriptor64(struct real_descriptor64 *_desc, unsigned long base, unsigned #endif /* Fill a gate with particular values. */ -MACH_INLINE void +static inline void fill_gate(struct real_gate *gate, unsigned long offset, unsigned short selector, unsigned char access, unsigned char word_count) { diff --git a/i386/i386/trap.c b/i386/i386/trap.c index 1128145e..1e04ae7d 100644 --- a/i386/i386/trap.c +++ b/i386/i386/trap.c @@ -88,7 +88,7 @@ extern boolean_t kttd_enabled; boolean_t debug_all_traps_with_kttd = TRUE; #endif /* MACH_TTD */ -void +static void user_page_fault_continue(kern_return_t kr) { thread_t thread = current_thread(); diff --git a/i386/i386/trap.h b/i386/i386/trap.h index 46612db5..d9df7afa 100644 --- a/i386/i386/trap.h +++ b/i386/i386/trap.h @@ -45,6 +45,26 @@ i386_exception( extern void thread_kdb_return(void); +/* + * Trap from kernel mode. Only page-fault errors are recoverable, + * and then only in special circumstances. All other errors are + * fatal. + */ +void kernel_trap(struct i386_saved_state *regs); + +/* + * Trap from user mode. + * Return TRUE if from emulated system call. + */ +int user_trap(struct i386_saved_state *regs); + +/* + * Handle AST traps for i386. + * Check for delayed floating-point exception from + * AT-bus machines. + */ +void i386_astintr(void); + #endif /* !__ASSEMBLER__ */ #endif /* _I386_TRAP_H_ */ diff --git a/i386/i386/tss.h b/i386/i386/tss.h index 31e1f5cb..fd7e7147 100644 --- a/i386/i386/tss.h +++ b/i386/i386/tss.h @@ -100,7 +100,7 @@ struct task_tss /* Load the current task register. */ -MACH_INLINE void +static inline void ltr(unsigned short segment) { __asm volatile("ltr %0" : : "r" (segment) : "memory"); diff --git a/i386/i386/user_ldt.c b/i386/i386/user_ldt.c index fdff518e..858da681 100644 --- a/i386/i386/user_ldt.c +++ b/i386/i386/user_ldt.c @@ -39,6 +39,7 @@ #include <i386/seg.h> #include <i386/thread.h> #include <i386/user_ldt.h> +#include <i386/i386/mach_i386.server.h> #include <stddef.h> #include "ldt.h" #include "vm_param.h" diff --git a/i386/include/mach/i386/mach_i386.defs b/i386/include/mach/i386/mach_i386.defs index e110c899..4694522b 100644 --- a/i386/include/mach/i386/mach_i386.defs +++ b/i386/include/mach/i386/mach_i386.defs @@ -40,9 +40,12 @@ subsystem MACH_I386_IMPORTS #endif -type descriptor_t = struct[2] of int; +type descriptor_t = struct[2] of uint32_t; type descriptor_list_t = array[*] of descriptor_t; +type real_descriptor_t = descriptor_t; +type real_descriptor_list_t = array[*] of real_descriptor_t; + import <mach/machine/mach_i386_types.h>; #if KERNEL_SERVER @@ -66,13 +69,13 @@ skip; /* i386_io_port_list */ routine i386_set_ldt( target_thread : thread_t; first_selector : int; - desc_list : descriptor_list_t, serverCopy); + desc_list : real_descriptor_list_t, serverCopy); routine i386_get_ldt( target_thread : thread_t; first_selector : int; selector_count : int; - out desc_list : descriptor_list_t); + out desc_list : real_descriptor_list_t); /* Request a new port IO_PERM that represents the capability to access the I/O ports [FROM; TO] directly. MASTER_PORT is the master device port. @@ -104,10 +107,10 @@ routine i386_io_perm_modify( routine i386_set_gdt( target_thread : thread_t; inout selector : int; - desc : descriptor_t); + desc : real_descriptor_t); /* Fetch a segment descriptor set with a prior i386_set_gdt call. */ routine i386_get_gdt( target_thread : thread_t; selector : int; - out desc : descriptor_t); + out desc : real_descriptor_t); diff --git a/i386/include/mach/i386/mach_i386_types.h b/i386/include/mach/i386/mach_i386_types.h index f003636d..bfa91ca0 100644 --- a/i386/include/mach/i386/mach_i386_types.h +++ b/i386/include/mach/i386/mach_i386_types.h @@ -30,27 +30,60 @@ #ifndef _MACH_MACH_I386_TYPES_H_ #define _MACH_MACH_I386_TYPES_H_ +#ifndef __ASSEMBLER__ /* * i386 segment descriptor. */ -struct descriptor { +struct segment_descriptor { unsigned int low_word; unsigned int high_word; }; -typedef struct descriptor descriptor_t; -typedef struct descriptor *descriptor_list_t; -typedef const struct descriptor *const_descriptor_list_t; +typedef struct segment_descriptor descriptor_t; +typedef struct segment_descriptor *descriptor_list_t; +typedef const struct descriptor *const_segment_descriptor_list_t; + +/* + * Real segment descriptor. + */ +struct real_descriptor { + unsigned int limit_low:16, /* limit 0..15 */ + base_low:16, /* base 0..15 */ + base_med:8, /* base 16..23 */ + access:8, /* access byte */ + limit_high:4, /* limit 16..19 */ + granularity:4, /* granularity */ + base_high:8; /* base 24..31 */ +}; +typedef struct real_descriptor real_descriptor_t; +typedef real_descriptor_t *real_descriptor_list_t; +typedef const real_descriptor_list_t const_real_descriptor_list_t; + +#ifdef __x86_64__ +struct real_descriptor64 { + unsigned int limit_low:16, /* limit 0..15 */ + base_low:16, /* base 0..15 */ + base_med:8, /* base 16..23 */ + access:8, /* access byte */ + limit_high:4, /* limit 16..19 */ + granularity:4, /* granularity */ + base_high:8, /* base 24..31 */ + base_ext:32, /* base 32..63 */ + reserved1:8, + zero:5, + reserved2:19; +}; +#endif + +#endif /* !__ASSEMBLER__ */ /* * i386 I/O port */ -#ifdef MACH_KERNEL -#include <i386/io_perm.h> -#else /* MACH_KERNEL */ +#ifndef MACH_KERNEL typedef unsigned short io_port_t; typedef mach_port_t io_perm_t; -#endif /* MACH_KERNEL */ +#endif /* !MACH_KERNEL */ #endif /* _MACH_MACH_I386_TYPES_H_ */ diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c index 199f824e..d4a5df73 100644 --- a/i386/intel/pmap.c +++ b/i386/intel/pmap.c @@ -501,30 +501,6 @@ void ptep_check(ptep_t ptep) } #endif /* DEBUG_PTE_PAGE */ -/* - * Map memory at initialization. The physical addresses being - * mapped are not managed and are never unmapped. - * - * For now, VM is already on, we only need to map the - * specified memory. - */ -vm_offset_t pmap_map( - vm_offset_t virt, - phys_addr_t start, - phys_addr_t end, - int prot) -{ - int ps; - - ps = PAGE_SIZE; - while (start < end) { - pmap_enter(kernel_pmap, virt, start, prot, FALSE); - virt += ps; - start += ps; - } - return(virt); -} - /* * Back-door routine for mapping kernel VM at initialization. * Useful for mapping memory outside the range of direct mapped @@ -1108,7 +1084,7 @@ valid_page(phys_addr_t addr) * Must be called with the pmap system and the pmap unlocked, * since these must be unlocked to use vm_page_grab. */ -vm_offset_t +static vm_offset_t pmap_page_table_page_alloc(void) { vm_page_t m; @@ -1198,7 +1174,7 @@ void pmap_map_mfn(void *_addr, unsigned long mfn) { * The page-table page must have all mappings removed, * and be removed from its page directory. */ -void +static void pmap_page_table_page_dealloc(vm_offset_t pa) { vm_page_t m; @@ -2600,7 +2576,7 @@ pmap_pageable( /* * Clear specified attribute bits. */ -void +static void phys_attribute_clear( phys_addr_t phys, int bits) @@ -2684,7 +2660,7 @@ phys_attribute_clear( /* * Check specified attribute bits. */ -boolean_t +static boolean_t phys_attribute_test( phys_addr_t phys, int bits) diff --git a/i386/intel/pmap.h b/i386/intel/pmap.h index bad640c1..d6bf85fb 100644 --- a/i386/intel/pmap.h +++ b/i386/intel/pmap.h @@ -268,11 +268,12 @@ boolean_t cpu_update_needed[NCPUS]; */ void process_pmap_updates(pmap_t); -void pmap_update_interrupt(void); extern pmap_t kernel_pmap; #endif /* NCPUS > 1 */ +void pmap_update_interrupt(void); + /* * Machine dependent routines that are used only for i386/i486. */ -- 2.39.0