Changeset 897ad60 in mainline


Ignore:
Timestamp:
2006-04-13T16:11:27Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
39cea6a
Parents:
963074b3
Message:

Replace assembly from pm.c with new inline functions defined in asm.h.

Location:
arch
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/include/asm.h

    r963074b3 r897ad60  
    3030#define __amd64_ASM_H__
    3131
     32#include <arch/pm.h>
    3233#include <arch/types.h>
    3334#include <config.h>
     
    198199static inline void invlpg(__address addr)
    199200{
    200         __asm__ volatile ("invlpg %0\n" :: "m" (*((__native *)addr)));
     201        __asm__ volatile ("invlpg %0\n" :: "m" (*((__native *)addr)));
     202}
     203
     204/** Load GDTR register from memory.
     205 *
     206 * @param gdtr_reg Address of memory from where to load GDTR.
     207 */
     208static inline void gdtr_load(struct ptr_16_64 *gdtr_reg)
     209{
     210        __asm__ volatile ("lgdt %0\n" : : "m" (*gdtr_reg));
     211}
     212
     213/** Store GDTR register to memory.
     214 *
     215 * @param gdtr_reg Address of memory to where to load GDTR.
     216 */
     217static inline void gdtr_store(struct ptr_16_64 *gdtr_reg)
     218{
     219        __asm__ volatile ("sgdt %0\n" : : "m" (*gdtr_reg));
     220}
     221
     222/** Load IDTR register from memory.
     223 *
     224 * @param idtr_reg Address of memory from where to load IDTR.
     225 */
     226static inline void idtr_load(struct ptr_16_64 *idtr_reg)
     227{
     228        __asm__ volatile ("lidt %0\n" : : "m" (*idtr_reg));
     229}
     230
     231/** Load TR from descriptor table.
     232 *
     233 * @param sel Selector specifying descriptor of TSS segment.
     234 */
     235static inline void tr_load(__u16 sel)
     236{
     237        __asm__ volatile ("ltr %0" : : "r" (sel));
    201238}
    202239
  • arch/amd64/src/pm.c

    r963074b3 r897ad60  
    216216        gdt_tss_setlimit(&gdt_p[TSS_DES], sizeof(struct tss) - 1);
    217217
    218         __asm__("lgdt %0" : : "m"(gdtr));
    219         __asm__("lidt %0" : : "m"(idtr));
     218        gdtr_load(&gdtr);
     219        idtr_load(&idtr);
    220220        /*
    221221         * As of this moment, the current CPU has its own GDT pointing
    222222         * to its own TSS. We just need to load the TR register.
    223223         */
    224         __asm__("ltr %0" : : "r" ((__u16) gdtselector(TSS_DES)));
    225 }
     224        tr_load(gdtselector(TSS_DES));
     225}
  • arch/ia32/include/asm.h

    r963074b3 r897ad60  
    3131#define __ia32_ASM_H__
    3232
     33#include <arch/pm.h>
    3334#include <arch/types.h>
    3435#include <config.h>
     
    252253}
    253254
     255/** Load GDTR register from memory.
     256 *
     257 * @param gdtr_reg Address of memory from where to load GDTR.
     258 */
     259static inline void gdtr_load(struct ptr_16_32 *gdtr_reg)
     260{
     261        __asm__ volatile ("lgdt %0\n" : : "m" (*gdtr_reg));
     262}
     263
     264/** Store GDTR register to memory.
     265 *
     266 * @param gdtr_reg Address of memory to where to load GDTR.
     267 */
     268static inline void gdtr_store(struct ptr_16_32 *gdtr_reg)
     269{
     270        __asm__ volatile ("sgdt %0\n" : : "m" (*gdtr_reg));
     271}
     272
     273/** Load IDTR register from memory.
     274 *
     275 * @param idtr_reg Address of memory from where to load IDTR.
     276 */
     277static inline void idtr_load(struct ptr_16_32 *idtr_reg)
     278{
     279        __asm__ volatile ("lidt %0\n" : : "m" (*idtr_reg));
     280}
     281
     282/** Load TR from descriptor table.
     283 *
     284 * @param sel Selector specifying descriptor of TSS segment.
     285 */
     286static inline void tr_load(__u16 sel)
     287{
     288        __asm__ volatile ("ltr %0" : : "r" (sel));
     289}
     290
    254291#endif
  • arch/ia32/src/pm.c

    r963074b3 r897ad60  
    179179        idtr.limit = sizeof(idt);
    180180        idtr.base = (__address) idt;
    181         __asm__ volatile ("lgdt %0\n" : : "m" (gdtr));
    182         __asm__ volatile ("lidt %0\n" : : "m" (idtr)); 
     181        gdtr_load(&gdtr);
     182        idtr_load(&idtr);
    183183       
    184184        /*
     
    214214         * to its own TSS. We just need to load the TR register.
    215215         */
    216         __asm__ volatile ("ltr %0" : : "r" ((__u16) selector(TSS_DES)));
     216        tr_load(selector(TSS_DES));
    217217       
    218218        clean_IOPL_NT_flags();    /* Disable I/O on nonprivileged levels */
     
    225225        struct descriptor *gdt_p = (struct descriptor *) cpugdtr.base;
    226226
    227         __asm__ volatile ("sgdt %0\n" : : "m" (cpugdtr));
    228 
     227        gdtr_store(&cpugdtr);
    229228        gdt_setbase(&gdt_p[TLS_DES], tls);
    230229        /* Reload gdt register to update GS in CPU */
    231         __asm__ volatile ("lgdt %0\n" : : "m" (cpugdtr));
    232 }
     230        gdtr_load(&cpugdtr);
     231}
Note: See TracChangeset for help on using the changeset viewer.