version 1.1.1.1, 2008/06/03 10:38:45 |
version 1.1.1.1.2.1, 2008/08/13 17:12:30 |
|
|
/* |
/* |
* Copyright (c) 2005-2007, Kohsuke Ohtani |
* Copyright (c) 2005-2008, Kohsuke Ohtani |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
|
|
* because these are set only when privilege level is changed. |
* because these are set only when privilege level is changed. |
*/ |
*/ |
struct cpu_regs { |
struct cpu_regs { |
u_long ebx; /* +0 (00) --- s/w trap frame --- */ |
uint32_t ebx; /* +0 (00) --- s/w trap frame --- */ |
u_long ecx; /* +4 (04) */ |
uint32_t ecx; /* +4 (04) */ |
u_long edx; /* +8 (08) */ |
uint32_t edx; /* +8 (08) */ |
u_long esi; /* +12 (0C) */ |
uint32_t esi; /* +12 (0C) */ |
u_long edi; /* +16 (10) */ |
uint32_t edi; /* +16 (10) */ |
u_long ebp; /* +20 (14) */ |
uint32_t ebp; /* +20 (14) */ |
u_long eax; /* +24 (18) */ |
uint32_t eax; /* +24 (18) */ |
u_long ds; /* +28 (1C) */ |
uint32_t ds; /* +28 (1C) */ |
u_long es; /* +32 (20) */ |
uint32_t es; /* +32 (20) */ |
u_long trap_no; /* +36 (24) --- h/w trap frame --- */ |
uint32_t trap_no; /* +36 (24) --- h/w trap frame --- */ |
u_long err_code; /* +40 (28) */ |
uint32_t err_code; /* +40 (28) */ |
u_long eip; /* +44 (2C) */ |
uint32_t eip; /* +44 (2C) */ |
u_long cs; /* +48 (30) */ |
uint32_t cs; /* +48 (30) */ |
u_long eflags; /* +52 (34) */ |
uint32_t eflags; /* +52 (34) */ |
u_long esp; /* +56 (38) */ |
uint32_t esp; /* +56 (38) */ |
u_long ss; /* +60 (3C) */ |
uint32_t ss; /* +60 (3C) */ |
}; |
}; |
|
|
/* |
/* |
* Kernel mode context for context switching. |
* Kernel mode context for context switching. |
*/ |
*/ |
struct kern_regs { |
struct kern_regs { |
u_long eip; /* +0 (00) */ |
uint32_t eip; /* +0 (00) */ |
u_long edi; /* +4 (04) */ |
uint32_t ebx; /* +4 (04) */ |
u_long esi; /* +8 (08) */ |
uint32_t edi; /* +8 (08) */ |
u_long ebp; /* +12 (0C) */ |
uint32_t esi; /* +12 (0C) */ |
u_long esp; /* +16 (10) */ |
uint32_t ebp; /* +16 (10) */ |
|
uint32_t esp; /* +20 (14) */ |
}; |
}; |
|
|
#ifdef CONFIG_FPU |
#ifdef CONFIG_FPU |
|
|
* FPU register for fsave/frstor |
* FPU register for fsave/frstor |
*/ |
*/ |
struct fpu_regs { |
struct fpu_regs { |
u_long ctrl_word; |
uint32_t ctrl_word; |
u_long stat_word; |
uint32_t stat_word; |
u_long tag_word; |
uint32_t tag_word; |
u_long ip_offset; |
uint32_t ip_offset; |
u_long cs_sel; |
uint32_t cs_sel; |
u_long op_offset; |
uint32_t op_offset; |
u_long op_sel; |
uint32_t op_sel; |
u_long st[20]; |
uint32_t st[20]; |
}; |
}; |
#endif |
#endif |
|
|
|
|
struct context { |
struct context { |
struct kern_regs kregs; /* kernel mode registers */ |
struct kern_regs kregs; /* kernel mode registers */ |
struct cpu_regs *uregs; /* user mode registers */ |
struct cpu_regs *uregs; /* user mode registers */ |
|
struct cpu_regs *saved_regs; /* saved user mode registers */ |
#ifdef CONFIG_FPU |
#ifdef CONFIG_FPU |
struct fpu_regs *fregs; /* co-processor registers */ |
struct fpu_regs *fregs; /* co-processor registers */ |
#endif |
#endif |
u_long esp0; /* top of kernel stack */ |
uint32_t esp0; /* top of kernel stack */ |
}; |
}; |
|
|
typedef struct context *context_t; /* context id */ |
typedef struct context *context_t; /* context id */ |
|
|
/* types for context_set */ |
/* types for context_set */ |
#define CTX_UENTRY 0 /* set user mode entry addres */ |
#define CTX_KSTACK 0 /* set kernel mode entry address */ |
#define CTX_USTACK 1 /* set user mode stack address */ |
#define CTX_KENTRY 1 /* set kernel mode entry address */ |
#define CTX_KENTRY 2 /* set kernel mode entry address */ |
#define CTX_KARG 2 /* set kernel mode argument */ |
#define CTX_KARG 3 /* set kernel mode argument */ |
#define CTX_USTACK 3 /* set user mode stack address */ |
|
#define CTX_UENTRY 4 /* set user mode entry addres */ |
|
#define CTX_UARG 5 /* set user mode argument */ |
|
|
extern void context_init(context_t, u_long); |
extern void context_set(context_t, int, vaddr_t); |
extern void context_set(context_t, int, u_long); |
extern void context_switch(context_t, context_t); |
extern void context_switch(context_t, context_t); |
extern void context_save(context_t); |
extern void context_save(context_t, int); |
extern void context_restore(context_t); |
extern void context_restore(context_t, void *); |
|
|
|
/* |
/* |
* Memory Management Unit |
* Memory Management Unit |
*/ |
*/ |
|
typedef uint32_t *pgd_t; /* page directory */ |
|
|
typedef long *pgd_t; /* page directory */ |
|
|
|
/* memory page type */ |
/* memory page type */ |
#define PG_UNMAP 0 /* no page */ |
#define PG_UNMAP 0 /* no page */ |
#define PG_READ 1 /* read only */ |
#define PG_READ 1 /* read only */ |
#define PG_WRITE 2 /* read/write */ |
#define PG_WRITE 2 /* read/write */ |
|
|
#ifdef CONFIG_MMU |
#ifdef CONFIG_MMU |
extern void mmu_init(void); |
extern void mmu_init(void); |
extern pgd_t mmu_newmap(void); |
extern pgd_t mmu_newmap(void); |
extern void mmu_delmap(pgd_t); |
extern void mmu_delmap(pgd_t); |
extern int mmu_map(pgd_t, void *, void *, size_t, int); |
extern int mmu_map(pgd_t, void *, void *, size_t, int); |
extern void mmu_switch(pgd_t); |
extern void mmu_switch(pgd_t); |
extern void *mmu_extract(pgd_t, void *, size_t); |
extern void *mmu_extract(pgd_t, void *, size_t); |
#else /* CONFIG_MMU */ |
#else /* CONFIG_MMU */ |
#define mmu_init() do {} while (0) |
#define mmu_init() do {} while (0) |
#endif /* CONFIG_MMU */ |
#endif /* CONFIG_MMU */ |
|
|
/* |
/* |
* User Memory access |
* User Memory access |
*/ |
*/ |
extern int umem_copyin(void *, void *, size_t); |
extern int umem_copyin(const void *, void *, size_t); |
extern int umem_copyout(void *, void *, size_t); |
extern int umem_copyout(const void *, void *, size_t); |
extern int umem_strnlen(const char *, size_t, size_t *); |
extern int umem_strnlen(const char *, size_t, size_t *); |
|
|
#define breakpoint() __asm__ __volatile__("int $3"::) |
extern void syscall_ret(void); |
|
extern void breakpoint(void); |
|
|
#endif /* !_ARCH_H */ |
#endif /* !_ARCH_H */ |