Applied, thanks! Flavio Cruz, le mar. 24 janv. 2023 01:44:23 -0500, a ecrit: > * 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 > >
-- Samuel --- Pour une évaluation indépendante, transparente et rigoureuse ! Je soutiens la Commission d'Évaluation de l'Inria.