Changeset 39cea6a in mainline for arch/amd64/src/proc/scheduler.c


Ignore:
Timestamp:
2006-04-13T17:38:03Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e185136
Parents:
897ad60
Message:

Cleanup pm.c and pm.h code on ia32 and amd64.
Add before_task_runs() and before_task_runs_arch() for each architecture.
Add ia32 and amd64 code to ensure I/O Permission Bitmap update.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/src/proc/scheduler.c

    r897ad60 r39cea6a  
    2929#include <proc/scheduler.h>
    3030#include <cpu.h>
     31#include <proc/task.h>
    3132#include <proc/thread.h>
    3233#include <arch.h>
     
    3536#include <arch/debugger.h>
    3637#include <print.h>
     38#include <arch/pm.h>
    3739
     40/** Perform amd64 specific tasks needed before the new task is run. */
     41void before_task_runs_arch(void)
     42{
     43}
     44
     45/** Perform amd64 specific tasks needed before the new thread is scheduled. */
    3846void before_thread_runs_arch(void)
    3947{
     48        size_t iomap_size;
     49        ptr_16_64_t cpugdtr;
     50        descriptor_t *gdt_p;
     51
    4052        CPU->arch.tss->rsp0 = (__address) &THREAD->kstack[THREAD_STACK_SIZE-SP_DELTA];
    4153
     
    4355         * hidden part of gs */
    4456        swapgs();
    45         write_msr(AMD_MSR_GS,
    46                   (__u64)&THREAD->kstack);
     57        write_msr(AMD_MSR_GS, (__u64)&THREAD->kstack);
    4758        swapgs();
    4859
    4960        /* TLS support - set FS to thread local storage */
    5061        write_msr(AMD_MSR_FS, THREAD->arch.tls);
     62
     63        /*
     64         * Switch the I/O Permission Bitmap, if necessary.
     65         *
     66         * First, copy the I/O Permission Bitmap.
     67         * This needs to be changed so that the
     68         * copying is avoided if the same task
     69         * was already running and the iomap did
     70         * not change.
     71         */
     72        spinlock_lock(&TASK->lock);
     73        iomap_size = TASK->arch.iomap_size;
     74        if (iomap_size) {
     75                ASSERT(TASK->arch.iomap);
     76                memcpy(CPU->arch.tss->iomap, TASK->arch.iomap, iomap_size);
     77                CPU->arch.tss->iomap[iomap_size] = 0xff;        /* terminating byte */
     78        }
     79        spinlock_unlock(&TASK->lock);
     80
     81        /* Second, adjust TSS segment limit. */
     82        gdtr_store(&cpugdtr);
     83        gdt_p = (descriptor_t *) cpugdtr.base;
     84        gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + iomap_size - 1);
     85        gdtr_load(&cpugdtr);
    5186
    5287#ifdef CONFIG_DEBUG_AS_WATCHPOINT
Note: See TracChangeset for help on using the changeset viewer.