Removed B_EXACT_KERNEL_ADDRESS again.

Replaced "addr" with "addr_t".
Header cleanups.
There is no need to call set_tls_context() in arch_thread_init_tls().


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7880 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-06-09 18:10:45 +00:00
parent 577402ea7e
commit 6ee4a2f161
9 changed files with 56 additions and 94 deletions
+16 -18
View File
@@ -1,24 +1,22 @@
/* /*
** Copyright 2002-2004, The OpenBeOS Team. All rights reserved.
** Distributed under the terms of the OpenBeOS License.
**
** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. ** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License. ** Distributed under the terms of the NewOS License.
*/ */
#include <kernel.h>
#include <arch/cpu.h> #include <arch/cpu.h>
#include <malloc.h>
#include <vm.h> #include <vm.h>
#include <debug.h>
#include <smp.h> #include <smp.h>
#include <arch/x86/selector.h> #include <arch/x86/selector.h>
#include <Errors.h>
#include <kerrors.h>
#include <tls.h> #include <tls.h>
#include <boot/stage2.h>
#include <string.h> #include <string.h>
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
static struct tss **tss; static struct tss **tss;
static int *tss_loaded; static int *tss_loaded;
@@ -51,7 +49,7 @@ arch_cpu_init2(kernel_args *ka)
gGDT = (segment_descriptor *)ka->arch_args.vir_gdt; gGDT = (segment_descriptor *)ka->arch_args.vir_gdt;
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "gdt", (void **)&gGDT, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "gdt", (void **)&gGDT,
B_EXACT_KERNEL_ADDRESS, PAGE_SIZE, B_ALREADY_WIRED, B_EXACT_ADDRESS, B_PAGE_SIZE, B_ALREADY_WIRED,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
// currently taken out of the build, because it's not yet used (and assumes // currently taken out of the build, because it's not yet used (and assumes
@@ -91,7 +89,7 @@ arch_cpu_init2(kernel_args *ka)
tss[i]->ss0 = KERNEL_DATA_SEG; tss[i]->ss0 = KERNEL_DATA_SEG;
// add TSS descriptor for this new TSS // add TSS descriptor for this new TSS
set_tss_descriptor(&gGDT[TSS_BASE_SEGMENT + i], (addr)tss[i], sizeof(struct tss)); set_tss_descriptor(&gGDT[TSS_BASE_SEGMENT + i], (addr_t)tss[i], sizeof(struct tss));
} }
// setup TLS descriptors (one for every CPU) // setup TLS descriptors (one for every CPU)
@@ -106,7 +104,7 @@ arch_cpu_init2(kernel_args *ka)
void void
i386_set_tss_and_kstack(addr kstack) i386_set_tss_and_kstack(addr_t kstack)
{ {
int currentCPU = smp_get_current_cpu(); int currentCPU = smp_get_current_cpu();
@@ -124,7 +122,7 @@ i386_set_tss_and_kstack(addr kstack)
void void
arch_cpu_invalidate_TLB_range(addr start, addr end) arch_cpu_invalidate_TLB_range(addr_t start, addr_t end)
{ {
int num_pages = end/PAGE_SIZE - start/PAGE_SIZE; int num_pages = end/PAGE_SIZE - start/PAGE_SIZE;
while (num_pages-- >= 0) { while (num_pages-- >= 0) {
@@ -135,7 +133,7 @@ arch_cpu_invalidate_TLB_range(addr start, addr end)
void void
arch_cpu_invalidate_TLB_list(addr pages[], int num_pages) arch_cpu_invalidate_TLB_list(addr_t pages[], int num_pages)
{ {
int i; int i;
for (i = 0; i < num_pages; i++) { for (i = 0; i < num_pages; i++) {
@@ -145,12 +143,12 @@ arch_cpu_invalidate_TLB_list(addr pages[], int num_pages)
int int
arch_cpu_user_memcpy(void *to, const void *from, size_t size, addr *fault_handler) arch_cpu_user_memcpy(void *to, const void *from, size_t size, addr_t *fault_handler)
{ {
char *tmp = (char *)to; char *tmp = (char *)to;
char *s = (char *)from; char *s = (char *)from;
*fault_handler = (addr)&&error; *fault_handler = (addr_t)&&error;
while (size--) while (size--)
*tmp++ = *s++; *tmp++ = *s++;
@@ -165,11 +163,11 @@ error:
int int
arch_cpu_user_strlcpy(char *to, const char *from, size_t size, addr *faultHandler) arch_cpu_user_strlcpy(char *to, const char *from, size_t size, addr_t *faultHandler)
{ {
int from_length = 0; int from_length = 0;
*faultHandler = (addr)&&error; *faultHandler = (addr_t)&&error;
if (size > 0) { if (size > 0) {
to[--size] = '\0'; to[--size] = '\0';
@@ -193,11 +191,11 @@ error:
int int
arch_cpu_user_memset(void *s, char c, size_t count, addr *fault_handler) arch_cpu_user_memset(void *s, char c, size_t count, addr_t *fault_handler)
{ {
char *xs = (char *)s; char *xs = (char *)s;
*fault_handler = (addr)&&error; *fault_handler = (addr_t)&&error;
while (count--) while (count--)
*xs++ = c; *xs++ = c;
@@ -6,6 +6,7 @@
** Modified 2001/09/05 by Rob Judd<[email protected]> ** Modified 2001/09/05 by Rob Judd<[email protected]>
** Modified 2002/09/28 by Marcus Overhagen <[email protected]> ** Modified 2002/09/28 by Marcus Overhagen <[email protected]>
*/ */
#include <kernel.h> #include <kernel.h>
#include <int.h> #include <int.h>
#include <arch/cpu.h> #include <arch/cpu.h>
+1 -1
View File
@@ -66,7 +66,7 @@ dbg_stack_trace(int argc, char **argv)
} else { } else {
uint32 eip = *((uint32 *)ebp + 1); uint32 eip = *((uint32 *)ebp + 1);
const char *symbol, *image; const char *symbol, *image;
addr baseAddress; addr_t baseAddress;
bool exactMatch; bool exactMatch;
if (eip == 0 || ebp == 0) if (eip == 0 || ebp == 0)
+3 -14
View File
@@ -2,25 +2,14 @@
** Copyright 2001, Travis Geiselbrecht. All rights reserved. ** Copyright 2001, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License. ** Distributed under the terms of the NewOS License.
*/ */
#include <kernel.h>
#include <KernelExport.h>
#include <faults.h> #include <faults.h>
#include <faults_priv.h> #include <faults_priv.h>
#include <vm.h> #include <boot/kernel_args.h>
#include <debug.h>
#include <console.h>
#include <int.h>
#include <arch/cpu.h>
#include <arch/int.h>
#include <arch/faults.h> #include <arch/faults.h>
#include <arch/x86/interrupts.h>
#include <arch/x86/faults.h>
#include <boot/stage2.h>
#include <string.h>
// XXX this module is largely outdated. Will probably be removed later. // XXX this module is largely outdated. Will probably be removed later.
int arch_faults_init(kernel_args *ka) int arch_faults_init(kernel_args *ka)
+8 -23
View File
@@ -1,23 +1,15 @@
/* /*
** Copyright 2002-2004, The OpenBeOS Team. All rights reserved. ** Copyright 2002-2004, The OpenBeOS Team. All rights reserved.
** Distributed under the terms of the OpenBeOS License. ** Distributed under the terms of the OpenBeOS License.
*/ **
/*
** Copyright 2001, Travis Geiselbrecht. All rights reserved. ** Copyright 2001, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License. ** Distributed under the terms of the NewOS License.
*/ */
#include <kernel.h>
#include <vm.h> #include <vm.h>
#include <debug.h>
#include <console.h>
#include <int.h> #include <int.h>
#include <thread.h> #include <thread.h>
#include <smp.h> #include <smp.h>
#include <syscalls.h>
#include <Errors.h>
#include <kerrors.h>
#include <vm_priv.h> #include <vm_priv.h>
#include <ksyscalls.h> #include <ksyscalls.h>
@@ -31,8 +23,6 @@
#include <arch/x86/faults.h> #include <arch/x86/faults.h>
#include <arch/x86/descriptors.h> #include <arch/x86/descriptors.h>
#include <boot/stage2.h>
#include <string.h> #include <string.h>
#define MAX_ARGS 16 #define MAX_ARGS 16
@@ -195,7 +185,7 @@ i386_handle_trap(struct iframe frame)
case 14: // page fault case 14: // page fault
{ {
unsigned int cr2; unsigned int cr2;
addr newip; addr_t newip;
asm("movl %%cr2, %0" : "=r" (cr2)); asm("movl %%cr2, %0" : "=r" (cr2));
@@ -223,7 +213,6 @@ i386_handle_trap(struct iframe frame)
{ {
uint64 retcode; uint64 retcode;
unsigned int args[MAX_ARGS]; unsigned int args[MAX_ARGS];
int rc;
thread_atkernel_entry(); thread_atkernel_entry();
#if 0 #if 0
@@ -243,15 +232,11 @@ i386_handle_trap(struct iframe frame)
** each is verified to make sure someone doesn't try to clobber it ** each is verified to make sure someone doesn't try to clobber it
*/ */
if (frame.ecx <= MAX_ARGS) { if (frame.ecx <= MAX_ARGS) {
if ((addr)frame.edx >= KERNEL_BASE && (addr)frame.edx <= KERNEL_TOP) { if (IS_KERNEL_ADDRESS(frame.edx)
retcode = ERR_VM_BAD_USER_MEMORY; || user_memcpy(args, (void *)frame.edx, frame.ecx * sizeof(unsigned int)) < B_OK) {
} else { retcode = B_BAD_ADDRESS;
rc = user_memcpy(args, (void *)frame.edx, frame.ecx * sizeof(unsigned int)); } else
if (rc < 0) ret = syscall_dispatcher(frame.eax, (void *)args, &retcode);
retcode = ERR_VM_BAD_USER_MEMORY;
else
ret = syscall_dispatcher(frame.eax, (void *)args, &retcode);
}
} else { } else {
// want to pass too many args into the system // want to pass too many args into the system
retcode = EINVAL; retcode = EINVAL;
@@ -361,7 +346,7 @@ arch_int_init2(kernel_args *ka)
{ {
idt = (desc_table *)ka->arch_args.vir_idt; idt = (desc_table *)ka->arch_args.vir_idt;
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "idt", (void *)&idt, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "idt", (void *)&idt,
B_EXACT_KERNEL_ADDRESS, PAGE_SIZE, B_ALREADY_WIRED, B_EXACT_ADDRESS, B_PAGE_SIZE, B_ALREADY_WIRED,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
return 0; return 0;
} }
+5 -3
View File
@@ -1,9 +1,11 @@
/* /*
** Copyright 2002-2004, The OpenBeOS Team. All rights reserved.
** Distributed under the terms of the OpenBeOS License.
**
** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. ** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License. ** Distributed under the terms of the NewOS License.
*/ */
#include <OS.h>
#include <boot/kernel_args.h> #include <boot/kernel_args.h>
#include <vm.h> #include <vm.h>
#include <int.h> #include <int.h>
@@ -111,10 +113,10 @@ arch_smp_init(kernel_args *ka)
// setup regions that represent the apic & ioapic // setup regions that represent the apic & ioapic
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "local_apic", (void *)&apic, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "local_apic", (void *)&apic,
B_EXACT_KERNEL_ADDRESS, PAGE_SIZE, B_ALREADY_WIRED, B_EXACT_ADDRESS, B_PAGE_SIZE, B_ALREADY_WIRED,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "ioapic", (void *)&ioapic, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "ioapic", (void *)&ioapic,
B_EXACT_KERNEL_ADDRESS, PAGE_SIZE, B_ALREADY_WIRED, B_EXACT_ADDRESS, B_PAGE_SIZE, B_ALREADY_WIRED,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
// set up the local apic on the boot cpu // set up the local apic on the boot cpu
+10 -15
View File
@@ -1,23 +1,19 @@
/* /*
** Copyright 2002-2004, The OpenBeOS Team. All rights reserved.
** Distributed under the terms of the OpenBeOS License.
**
** Copyright 2001, Travis Geiselbrecht. All rights reserved. ** Copyright 2001, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License. ** Distributed under the terms of the NewOS License.
*/ */
#include <kernel.h>
#include <boot/stage2.h>
#include <debug.h>
#include <vm.h>
#include <memheap.h>
#include <thread.h> #include <thread.h>
#include <arch/thread.h> #include <arch/thread.h>
#include <arch_cpu.h> #include <arch_cpu.h>
#include <int.h> #include <int.h>
#include <string.h>
#include <Errors.h>
#include <signal.h>
#include <tls.h> #include <tls.h>
#include <string.h>
//#define TRACE_ARCH_THREAD //#define TRACE_ARCH_THREAD
#ifdef TRACE_ARCH_THREAD #ifdef TRACE_ARCH_THREAD
@@ -77,6 +73,7 @@ arch_thread_init_thread_struct(struct thread *t)
// set up an initial state (stack & fpu) // set up an initial state (stack & fpu)
memset(&t->arch_info, 0, sizeof(t->arch_info)); memset(&t->arch_info, 0, sizeof(t->arch_info));
// ToDo: note, this has to be done only once
// let the asm function know the offset to the interrupt stack within struct thread // let the asm function know the offset to the interrupt stack within struct thread
// I know no better ( = static) way to tell the asm function the offset // I know no better ( = static) way to tell the asm function the offset
i386_stack_init(&((struct thread *)0)->arch_info.interrupt_stack); i386_stack_init(&((struct thread *)0)->arch_info.interrupt_stack);
@@ -146,13 +143,11 @@ arch_thread_init_tls(struct thread *thread)
tls[TLS_BASE_ADDRESS_SLOT] = thread->user_local_storage; tls[TLS_BASE_ADDRESS_SLOT] = thread->user_local_storage;
tls[TLS_THREAD_ID_SLOT] = thread->id; tls[TLS_THREAD_ID_SLOT] = thread->id;
tls[TLS_ERRNO_SLOT] = 0; tls[TLS_ERRNO_SLOT] = 0;
set_tls_context(thread);
} }
void void
arch_thread_switch_kstack_and_call(struct thread *t, addr new_kstack, void (*func)(void *), void *arg) arch_thread_switch_kstack_and_call(struct thread *t, addr_t new_kstack, void (*func)(void *), void *arg)
{ {
i386_switch_stack_and_call(new_kstack, func, arg); i386_switch_stack_and_call(new_kstack, func, arg);
} }
@@ -206,7 +201,7 @@ arch_thread_context_switch(struct thread *t_from, struct thread *t_to)
panic("arch_thread_context_switch: bad pgdir 0x%lx\n", new_pgdir); panic("arch_thread_context_switch: bad pgdir 0x%lx\n", new_pgdir);
i386_fsave_swap(t_from->arch_info.fpu_state, t_to->arch_info.fpu_state); i386_fsave_swap(t_from->arch_info.fpu_state, t_to->arch_info.fpu_state);
i386_context_switch(&t_from->arch_info, &t_to->arch_info, (addr)new_pgdir); i386_context_switch(&t_from->arch_info, &t_to->arch_info, (addr_t)new_pgdir);
} }
@@ -225,9 +220,9 @@ arch_thread_dump_info(void *info)
*/ */
void void
arch_thread_enter_uspace(struct thread *t, addr entry, void *args1, void *args2) arch_thread_enter_uspace(struct thread *t, addr_t entry, void *args1, void *args2)
{ {
addr ustack_top = t->user_stack_base + STACK_SIZE; addr_t ustack_top = t->user_stack_base + STACK_SIZE;
TRACE(("arch_thread_enter_uspace: entry 0x%lx, args %p %p, ustack_top 0x%lx\n", TRACE(("arch_thread_enter_uspace: entry 0x%lx, args %p %p, ustack_top 0x%lx\n",
entry, args1, args2, ustack_top)); entry, args1, args2, ustack_top));
+2 -5
View File
@@ -5,12 +5,9 @@
#include <KernelExport.h> #include <KernelExport.h>
#include <kernel.h>
#include <console.h>
#include <vm.h> #include <vm.h>
#include <vm_page.h> #include <vm_page.h>
#include <vm_priv.h> #include <vm_priv.h>
#include <debug.h>
#include <arch/vm.h> #include <arch/vm.h>
#include <arch/int.h> #include <arch/int.h>
@@ -18,8 +15,8 @@
#include <arch/x86/interrupts.h> #include <arch/x86/interrupts.h>
#define TRACE_ARCH_VM 0 #define TRACE_ARCH_VM
#if TRACE_ARCH_VM #ifdef TRACE_ARCH_VM
# define TRACE(x) dprintf x # define TRACE(x) dprintf x
#else #else
# define TRACE(x) ; # define TRACE(x) ;
@@ -1,27 +1,22 @@
/* /*
** Copyright 2002-2004, The OpenBeOS Team. All rights reserved.
** Distributed under the terms of the OpenBeOS License.
**
** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. ** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License. ** Distributed under the terms of the NewOS License.
*/ */
#include <kernel.h>
#include <malloc.h>
#include <int.h>
#include <smp.h> #include <smp.h>
#include <vm.h> #include <vm.h>
#include <vm_page.h> #include <vm_page.h>
#include <vm_priv.h> #include <vm_priv.h>
#include <debug.h>
#include <lock.h>
#include <OS.h>
#include <queue.h> #include <queue.h>
#include <string.h> #include <string.h>
#include <boot/stage2.h>
#include <Errors.h>
#include <kerrors.h> #include <kerrors.h>
#include <arch/cpu.h>
#include <arch/vm_translation_map.h> #include <arch/vm_translation_map.h>
#include <stdlib.h>
#define TRACE_VM_TMAP 0 #define TRACE_VM_TMAP 0
#if TRACE_VM_TMAP #if TRACE_VM_TMAP
# define TRACE(x) dprintf x # define TRACE(x) dprintf x
@@ -790,27 +785,27 @@ vm_translation_map_module_init2(kernel_args *ka)
temp = (void *)kernel_pgdir_virt; temp = (void *)kernel_pgdir_virt;
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "kernel_pgdir", &temp, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "kernel_pgdir", &temp,
B_EXACT_KERNEL_ADDRESS, PAGE_SIZE, B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_EXACT_ADDRESS, B_PAGE_SIZE, B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
temp = (void *)paddr_desc; temp = (void *)paddr_desc;
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "physical_page_mapping_descriptors", &temp, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "physical_page_mapping_descriptors", &temp,
B_EXACT_KERNEL_ADDRESS, ROUNDUP(sizeof(paddr_chunk_desc) * 1024, PAGE_SIZE), B_EXACT_ADDRESS, ROUNDUP(sizeof(paddr_chunk_desc) * 1024, PAGE_SIZE),
B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
temp = (void *)virtual_pmappings; temp = (void *)virtual_pmappings;
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "iospace_virtual_chunk_descriptors", &temp, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "iospace_virtual_chunk_descriptors", &temp,
B_EXACT_KERNEL_ADDRESS, ROUNDUP(sizeof(paddr_chunk_desc *) * num_virtual_chunks, PAGE_SIZE), B_EXACT_ADDRESS, ROUNDUP(sizeof(paddr_chunk_desc *) * num_virtual_chunks, PAGE_SIZE),
B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
temp = (void *)iospace_pgtables; temp = (void *)iospace_pgtables;
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "iospace_pgtables", &temp, vm_create_anonymous_region(vm_get_kernel_aspace_id(), "iospace_pgtables", &temp,
B_EXACT_KERNEL_ADDRESS, PAGE_SIZE * (IOSPACE_SIZE / (PAGE_SIZE * 1024)), B_EXACT_ADDRESS, B_PAGE_SIZE * (IOSPACE_SIZE / (B_PAGE_SIZE * 1024)),
B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA); B_ALREADY_WIRED, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
TRACE(("vm_translation_map_module_init2: creating iospace\n")); TRACE(("vm_translation_map_module_init2: creating iospace\n"));
temp = (void *)IOSPACE_BASE; temp = (void *)IOSPACE_BASE;
vm_create_null_region(vm_get_kernel_aspace_id(), "iospace", &temp, vm_create_null_region(vm_get_kernel_aspace_id(), "iospace", &temp,
B_EXACT_KERNEL_ADDRESS, IOSPACE_SIZE); B_EXACT_ADDRESS, IOSPACE_SIZE);
TRACE(("vm_translation_map_module_init2: done\n")); TRACE(("vm_translation_map_module_init2: done\n"));